Merge branch 'master' of ssh://ssh.nx2.site:50022/nx2/dotfiles

This commit is contained in:
Lennart J. Kurzweg (Nx2)
2025-04-11 14:00:18 +02:00
27 changed files with 573 additions and 413 deletions

View File

@@ -42,9 +42,11 @@
./system-modules/ydotool.nix ./system-modules/ydotool.nix
]) ++ (if (host == "NxACE") then [ ]) ++ (if (host == "NxACE") then [
./system-modules/nx2site.nix ./system-modules/nx2site.nix
./system-modules/hugo.nix
./system-modules/postgres.nix ./system-modules/postgres.nix
./system-modules/nx2site/proxy.nix ./system-modules/nx2site/proxy.nix
./system-modules/nx2site/audiobookshelf.nix ./system-modules/nx2site/audiobookshelf.nix
# ./system-modules/nx2site/dyn_dns.nix
./system-modules/nx2site/gitea.nix ./system-modules/nx2site/gitea.nix
./system-modules/nx2site/open-web-calendar.nix ./system-modules/nx2site/open-web-calendar.nix
./system-modules/nx2site/radicale.nix ./system-modules/nx2site/radicale.nix
@@ -54,6 +56,7 @@
./system-modules/calendar-publish.nix ./system-modules/calendar-publish.nix
./system-modules/calendar-lec.nix ./system-modules/calendar-lec.nix
./system-modules/calendar-lr.nix
./system-modules/calendar-dicos.nix ./system-modules/calendar-dicos.nix
] else []); ] else []);

158
flake.lock generated
View File

@@ -8,11 +8,11 @@
"systems": "systems" "systems": "systems"
}, },
"locked": { "locked": {
"lastModified": 1739004667, "lastModified": 1742767019,
"narHash": "sha256-t/KaeHEgzh225HUdAiHXRsgDeyDrBCMTg0LjR73v3Nw=", "narHash": "sha256-FdyHDbf31jl5rIU7IQtBVTbZ1ojGrrp5aFaRrE2819s=",
"owner": "KZDKM", "owner": "KZDKM",
"repo": "Hyprspace", "repo": "Hyprspace",
"rev": "ac55bbdb6cee760af9315899b5b187a40ce43e46", "rev": "5b62529c2011ede6069445de9b5b3f8a1f10ecfe",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -41,11 +41,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1739103745, "lastModified": 1742213273,
"narHash": "sha256-c53dcRaw0F4Os9WD05HwIRs9kTDZw4Mxe1XK4edEALo=", "narHash": "sha256-0l0vDb4anfsBu1rOs94bC73Hub+xEivgBAo6QXl2MmU=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "aquamarine", "repo": "aquamarine",
"rev": "a3dda0d10ce9aa1d1dfb7a6c139ea8c2872c74bd", "rev": "484b732195cc53f4536ce4bd59a5c6402b1e7ccf",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -278,14 +278,14 @@
"nixpkgs-stable": "nixpkgs-stable", "nixpkgs-stable": "nixpkgs-stable",
"nixpkgs-unstable": "nixpkgs-unstable", "nixpkgs-unstable": "nixpkgs-unstable",
"zig": "zig", "zig": "zig",
"zig2nix": "zig2nix" "zon2nix": "zon2nix"
}, },
"locked": { "locked": {
"lastModified": 1739767522, "lastModified": 1743191728,
"narHash": "sha256-VuHnvVVLFDZe9GAPH67clJNhp+H3WoRB5JfQpUbwsbk=", "narHash": "sha256-LrQd2IkfcmHdBh+pwPEPXzcosBerIEFzz/DbVNzBqig=",
"owner": "ghostty-org", "owner": "ghostty-org",
"repo": "ghostty", "repo": "ghostty",
"rev": "429c8ab277f75b581959ac5515b0c32636839168", "rev": "1067cd3d8a061eb5b23bc1a4c46ca10af4481941",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -367,11 +367,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1739757849, "lastModified": 1742655702,
"narHash": "sha256-Gs076ot1YuAAsYVcyidLKUMIc4ooOaRGO0PqTY7sBzA=", "narHash": "sha256-jbqlw4sPArFtNtA1s3kLg7/A4fzP4GLk9bGbtUJg0JQ=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "9d3d080aec2a35e05a15cedd281c2384767c2cfe", "rev": "0948aeedc296f964140d9429223c7e4a0702a1ff",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -397,11 +397,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1738664950, "lastModified": 1742215578,
"narHash": "sha256-xIeGNM+iivwVHkv9tHwOqoUP5dDrtees34bbFKKMZYs=", "narHash": "sha256-zfs71PXVVPEe56WEyNi2TJQPs0wabU4WAlq0XV7GcdE=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprcursor", "repo": "hyprcursor",
"rev": "7c6d165e1eb9045a996551eb9f121b6d1b30adc3", "rev": "2fd36421c21aa87e2fe3bee11067540ae612f719",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -455,11 +455,11 @@
"xdph": "xdph" "xdph": "xdph"
}, },
"locked": { "locked": {
"lastModified": 1739757807, "lastModified": 1743297135,
"narHash": "sha256-R+fSm684OXCOjhhdANCgBvUPRPiya6Cyi2zV5Xf6sHI=", "narHash": "sha256-4JgyJLuHxeoeSsSbi4MkpVYsI4R74Trov33sIg1fa/0=",
"ref": "refs/heads/main", "ref": "refs/heads/main",
"rev": "59c615c321c45302491de3b1c003844c86aefca7", "rev": "da2d7c3971d40f841f2afd7def8e4bad9a351e41",
"revCount": 5825, "revCount": 5948,
"submodules": true, "submodules": true,
"type": "git", "type": "git",
"url": "https://github.com/hyprwm/Hyprland" "url": "https://github.com/hyprwm/Hyprland"
@@ -487,11 +487,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1738966025, "lastModified": 1743339740,
"narHash": "sha256-MzgrF0jKlTNnNS33D8PwI5z2MJ1Tzf5MQVf/oms2pdw=", "narHash": "sha256-G6a7R/gb1xH0yI2uevTmDpxZf6rvMh1lOu0gYrqVu5U=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprland-plugins", "repo": "hyprland-plugins",
"rev": "4f48dbe12f3cbbeb4d31c91c67b21edbc5b4b451", "rev": "6dca4ece21864e329394b81cfc767778089097e2",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -609,11 +609,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1739048914, "lastModified": 1741191527,
"narHash": "sha256-vd5rJBTmp2w7SDgfv23Zcd84ktI5eDA7e5UBzx+pKrU=", "narHash": "sha256-kM+11Nch47Xwfgtw2EpRitJuORy4miwoMuRi5tyMBDY=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprlang", "repo": "hyprlang",
"rev": "a7334904d591f38757c46fbe2ab68651877d9099", "rev": "72df3861f1197e41b078faa3e38eedd60e00018d",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -629,11 +629,11 @@
"rust-overlay": "rust-overlay" "rust-overlay": "rust-overlay"
}, },
"locked": { "locked": {
"lastModified": 1738828244, "lastModified": 1741036724,
"narHash": "sha256-cmo544QvdacVTHPqmc6er4xnSSc63e6Z71BS0FxSklE=", "narHash": "sha256-nCsqa5dXW1Qja+smRkVpNkGAHfYkBFJ6U3bVilY5pDo=",
"owner": "h3rmt", "owner": "h3rmt",
"repo": "hyprswitch", "repo": "hyprswitch",
"rev": "bb06fb046aa1c204c2effa382573b8045cefd355", "rev": "3feeccf2f1d3d6c0fb7c79b965ccf382118651d2",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -655,11 +655,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1739048933, "lastModified": 1741534688,
"narHash": "sha256-ck6MaoYvISBQKqZR+HcxXnx0wOhyCauxfVMaV5zhJxQ=", "narHash": "sha256-EV3945SnjOCuRVbGRghsWx/9D89FyshnSO1Q6/TuQ14=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprutils", "repo": "hyprutils",
"rev": "e4e018a2ca6f5a9c33511973454199e1c7c85499", "rev": "dd1f720cbc2dbb3c71167c9598045dd3261d27b3",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -680,11 +680,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1739049028, "lastModified": 1739870480,
"narHash": "sha256-RleJp7LYbr6s+M1xgbmhtBs+fYa3ZdIiF7+QalJ4D1g=", "narHash": "sha256-SiDN5BGxa/1hAsqhgJsS03C3t2QrLgBT8u+ENJ0Qzwc=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprwayland-scanner", "repo": "hyprwayland-scanner",
"rev": "04146df74a8d5ec0b579657307be01f1e241125f", "rev": "206367a08dc5ac4ba7ad31bdca391d098082e64b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -720,11 +720,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1739020877, "lastModified": 1742669843,
"narHash": "sha256-mIvECo/NNdJJ/bXjNqIh8yeoSjVLAuDuTUzAo7dzs8Y=", "narHash": "sha256-G5n+FOXLXcRx+3hCJ6Rt6ZQyF1zqQ0DL0sWAMn2Nk0w=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "a79cfe0ebd24952b580b1cf08cd906354996d547", "rev": "1e5b653dff12029333a6546c11e108ede13052eb",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -736,11 +736,11 @@
}, },
"nixpkgs-latest": { "nixpkgs-latest": {
"locked": { "locked": {
"lastModified": 1739782683, "lastModified": 1743346368,
"narHash": "sha256-AnuWOZmBxX/pjQKwNnjGU5jjGKncfxV8Os10Ynv4I1k=", "narHash": "sha256-DJv361yCiMiMyKA1elFtgJ9CbK/nEXLKj7vY0zUBmTk=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "6534c6ea0867d38662b8c0d9af62cebffa00e353", "rev": "e68c2965da5c7f149dd8543c63d7217753e00c32",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -764,11 +764,11 @@
}, },
"nixpkgs-stable": { "nixpkgs-stable": {
"locked": { "locked": {
"lastModified": 1738255539, "lastModified": 1741992157,
"narHash": "sha256-hP2eOqhIO/OILW+3moNWO4GtdJFYCqAe9yJZgvlCoDQ=", "narHash": "sha256-nlIfTsTrMSksEJc1f7YexXiPVuzD1gOfeN1ggwZyUoc=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "c3511a3b53b482aa7547c9d1626fd7310c1de1c5", "rev": "da4b122f63095ca1199bd4d526f9e26426697689",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -796,11 +796,11 @@
}, },
"nixpkgs-unstable": { "nixpkgs-unstable": {
"locked": { "locked": {
"lastModified": 1738136902, "lastModified": 1741865919,
"narHash": "sha256-pUvLijVGARw4u793APze3j6mU1Zwdtz7hGkGGkD87qw=", "narHash": "sha256-4thdbnP6dlbdq+qZWTsm4ffAwoS8Tiq1YResB+RP6WE=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "9a5db3142ce450045840cc8d832b13b8a2018e0c", "rev": "573c650e8a14b2faa0041645ab18aed7e60f0c9a",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -812,11 +812,11 @@
}, },
"nixpkgs-unstable_2": { "nixpkgs-unstable_2": {
"locked": { "locked": {
"lastModified": 1739580444, "lastModified": 1743095683,
"narHash": "sha256-+/bSz4EAVbqz8/HsIGLroF8aNaO8bLRL7WfACN+24g4=", "narHash": "sha256-gWd4urRoLRe8GLVC/3rYRae1h+xfQzt09xOfb0PaHSk=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "8bb37161a0488b89830168b81c48aed11569cb93", "rev": "5e5402ecbcb27af32284d4a62553c019a3a49ea6",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -858,11 +858,11 @@
}, },
"nixpkgs_4": { "nixpkgs_4": {
"locked": { "locked": {
"lastModified": 1739624908, "lastModified": 1743231893,
"narHash": "sha256-f84lBmLl4tkDp1ZU5LBTSFzlxXP4926DVW3KnXrke10=", "narHash": "sha256-tpJsHMUPEhEnzySoQxx7+kA+KUtgWqvlcUBqROYNNt0=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "a60651b217d2e529729cbc7d989c19f3941b9250", "rev": "c570c1f5304493cafe133b8d843c7c1c4a10d3a6",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -913,11 +913,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1737465171, "lastModified": 1742649964,
"narHash": "sha256-R10v2hoJRLq8jcL4syVFag7nIGE7m13qO48wRIukWNg=", "narHash": "sha256-DwOTp7nvfi8mRfuL1escHDXabVXFGT1VlPD1JHrtrco=",
"owner": "cachix", "owner": "cachix",
"repo": "git-hooks.nix", "repo": "git-hooks.nix",
"rev": "9364dc02281ce2d37a1f55b6e51f7c0f65a75f17", "rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1049,11 +1049,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1739262228, "lastModified": 1743305778,
"narHash": "sha256-7JAGezJ0Dn5qIyA2+T4Dt/xQgAbhCglh6lzCekTVMeU=", "narHash": "sha256-Ux/UohNtnM5mn9SFjaHp6IZe2aAnUCzklMluNtV6zFo=",
"owner": "Mic92", "owner": "Mic92",
"repo": "sops-nix", "repo": "sops-nix",
"rev": "07af005bb7d60c7f118d9d9f5530485da5d1e975", "rev": "8e873886bbfc32163fe027b8676c75637b7da114",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1180,11 +1180,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1737634991, "lastModified": 1741934139,
"narHash": "sha256-dBAnb7Kbnier30cA7AgxVSxxARmxKZ1vHZT33THSIr8=", "narHash": "sha256-ZhTcTH9FoeAtbPfWGrhkH7RjLJZ7GeF18nygLAMR+WE=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland", "repo": "xdg-desktop-portal-hyprland",
"rev": "e09dfe2726c8008f983e45a0aa1a3b7416aaeb8a", "rev": "150b0b6f52bb422a1b232a53698606fe0320dde0",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1200,11 +1200,11 @@
"rust-overlay": "rust-overlay_3" "rust-overlay": "rust-overlay_3"
}, },
"locked": { "locked": {
"lastModified": 1739776850, "lastModified": 1743344227,
"narHash": "sha256-XWzxhk0Nrw9cu6E5yjsmhAVfbt9ArVN54zz8qgzBA/I=", "narHash": "sha256-Lp1JUMrhvAmCzftOSQ2Sr0+svemxSxcLeZ4HkmdLXbE=",
"owner": "sxyazi", "owner": "sxyazi",
"repo": "yazi", "repo": "yazi",
"rev": "1ddbbfea711636dcb997239ea9d2b483cea16f80", "rev": "1765aba68440f73c590cedac14ece6778fe88ff5",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1224,11 +1224,11 @@
"systems": "systems_6" "systems": "systems_6"
}, },
"locked": { "locked": {
"lastModified": 1737417368, "lastModified": 1742573336,
"narHash": "sha256-JExM3nZwg07iMhXDQSIXc5KmVqbBRA4IfNgs1gFmneg=", "narHash": "sha256-7cVQTyMA9V1YqqVXwaxmrsUKE8LjnBdIj6fvpKKuAxo=",
"owner": "lordkekz", "owner": "lordkekz",
"repo": "nix-yazi-plugins", "repo": "nix-yazi-plugins",
"rev": "c251d3db84f3a10f95993112132fe5ffc37a279f", "rev": "76e0104f5bfc2517d86cae0332ede54c6d5ba4e8",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1270,11 +1270,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1738239110, "lastModified": 1741825901,
"narHash": "sha256-Y5i9mQ++dyIQr+zEPNy+KIbc5wjPmfllBrag3cHZgcE=", "narHash": "sha256-aeopo+aXg5I2IksOPFN79usw7AeimH1+tjfuMzJHFdk=",
"owner": "mitchellh", "owner": "mitchellh",
"repo": "zig-overlay", "repo": "zig-overlay",
"rev": "1a8fb6f3a04724519436355564b95fce5e272504", "rev": "0b14285e283f5a747f372fb2931835dd937c4383",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -1283,7 +1283,7 @@
"type": "github" "type": "github"
} }
}, },
"zig2nix": { "zon2nix": {
"inputs": { "inputs": {
"flake-utils": [ "flake-utils": [
"ghostty", "ghostty",
@@ -1291,21 +1291,21 @@
], ],
"nixpkgs": [ "nixpkgs": [
"ghostty", "ghostty",
"nixpkgs-stable" "nixpkgs-unstable"
] ]
}, },
"locked": { "locked": {
"lastModified": 1738263917, "lastModified": 1742104771,
"narHash": "sha256-j/3fwe2pEOquHabP/puljOKwAZFjIE9gXZqA91sC48M=", "narHash": "sha256-LhidlyEA9MP8jGe1rEnyjGFCzLLgCdDpYeWggibayr0=",
"owner": "jcollie", "owner": "jcollie",
"repo": "zig2nix", "repo": "zon2nix",
"rev": "c311d8e77a6ee0d995f40a6e10a89a3a4ab04f9a", "rev": "56c159be489cc6c0e73c3930bd908ddc6fe89613",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "jcollie", "owner": "jcollie",
"ref": "c311d8e77a6ee0d995f40a6e10a89a3a4ab04f9a", "ref": "56c159be489cc6c0e73c3930bd908ddc6fe89613",
"repo": "zig2nix", "repo": "zon2nix",
"type": "github" "type": "github"
} }
} }

Binary file not shown.

View File

@@ -40,6 +40,20 @@
read-only = true; read-only = true;
type = "ics"; type = "ics";
} }
{
name = "LR";
url = "https://${domain}/lr.ics";
color = "#005040";
read-only = true;
type = "ics";
}
{
name = "Feiertage Hessen";
url = "https://ics.tools/Feiertage/hessen.ics";
color = "#303030";
read-only = true;
type = "ics";
}
# { # {
# name = "Handball Männer"; # name = "Handball Männer";
# url = "http://i.cal.to/ical/108/dhb/handball-nationalmannschaft/c687e97f.bc7c3eb6-11a0e356.ics"; # url = "http://i.cal.to/ical/108/dhb/handball-nationalmannschaft/c687e97f.bc7c3eb6-11a0e356.ics";

View File

@@ -2,28 +2,30 @@
let let
channels = [ channels = [
"Caedrel" "Caedrel"
"agurin" # "agurin"
"asmongold" # "asmongold"
# "Caedrel" # "Caedrel"
"EintrachtSpandau" # "EintrachtSpandau"
"GamesDoneQuick" "GamesDoneQuick"
"gdolphn" "gdolphn"
"GRONKH" "GRONKH"
"handofblood" "handofblood"
"HisWattson" "HisWattson"
"Jankos" "Jankos"
"KuruHS" # "KuruHS"
"LEC" "LEC"
"lol_nemesis" "lol_nemesis"
"NASA" # "NASA"
"NoWay4u_Sir" "NoWay4u_Sir"
"OfficialMikeShinoda" "OfficialMikeShinoda"
"Rekkles" "Rekkles"
"riotgames" "riotgames"
"thebausffs"
"ThePrimeagen" "ThePrimeagen"
"Tolkin" "Tolkin"
"TSM_ImperialHal" # "TSM_ImperialHal"
"Xisuma" "velja_lol"
# "Xisuma"
"zackrawrr" "zackrawrr"
]; ];
tabber = channel-name: { tabber = channel-name: {

View File

@@ -38,14 +38,17 @@
programs.fish = { programs.fish = {
enable = true; enable = true;
shellAliases = { shellAliases = let
ls = "eza --icons --git --smart-group --group-directories-first"; base-eza = "eza --icons --git --smart-group --group-directories-first";
ll = "eza --icons --git --smart-group --group-directories-first --long"; in {
la = "eza --icons --git --smart-group --group-directories-first --all"; ls = "${base-eza}";
lla = "eza --icons --git --smart-group --group-directories-first --all --long"; ll = "${base-eza} --long";
lt = "eza --icons --git --smart-group --group-directories-first --long --tree"; lg = "${base-eza} --group --long";
ltd = "eza --icons --git --smart-group --group-directories-first --long --tree -D"; la = "${base-eza} --all";
lt2 = "eza --icons --git --smart-group --group-directories-first --long --tree -L 2"; lla = "${base-eza} --all --long";
lt = "${base-eza} --long --tree";
ltd = "${base-eza} --long --tree -D";
lt2 = "${base-eza} --long --tree -L 2";
sr = "sudo reboot"; sr = "sudo reboot";
nf = "neofetch"; nf = "neofetch";
nxf = "nxfetch"; nxf = "nxfetch";

View File

@@ -1,5 +1,6 @@
{ pkgs-unstable, pkgs, lib, host, ... }: { pkgs-unstable, pkgs, lib, host, ... }:
lib.mkIf (host == "NxNORTH" || host == "NxACE") # lib.mkIf (host == "NxNORTH" || host == "NxACE")
lib.mkIf (host == "NxNORTH")
{ {
home = { home = {
packages = (with pkgs-unstable; [ packages = (with pkgs-unstable; [

View File

@@ -1,9 +1,10 @@
{ pkgs, lib, host, ... }: { pkgs-latest, ... }:
{ {
home.packages = with pkgs; [ home.packages = with pkgs-latest; [
(gimp-with-plugins.override { # (gimp-with-plugins.override {
plugins = with gimpPlugins; [ bimp ]; # plugins = with gimpPlugins; [ bimp ];
}) # })
gimp
]; ];
} }

View File

@@ -17,6 +17,7 @@
marksman # markdown marksman # markdown
vale-ls # style-checker lsp (needs vale) vale-ls # style-checker lsp (needs vale)
ltex-ls # Ltex (language tool) ltex-ls # Ltex (language tool)
vscode-langservers-extracted
] ++ (with pkgs-unstable; [ ] ++ (with pkgs-unstable; [
bash-language-server bash-language-server
helix helix
@@ -185,13 +186,13 @@
enable = false; enable = false;
supersend-menu = false; supersend-menu = false;
}; };
# inline-diagnostics = { inline-diagnostics = {
# cursor-line = "hint"; cursor-line = "hint";
# other-lines = "disable"; other-lines = "disable";
# prefix-len = 1; prefix-len = 1;
# # max-wrap = set above # max-wrap = set above
# max-diagnostics = 20; max-diagnostics = 20;
# }; };
}; };
keys = { keys = {
normal = { normal = {
@@ -303,8 +304,8 @@
base16 = with rice.color; { base16 = with rice.color; {
"attributes" = foreground; "attributes" = foreground;
"comment" = { "comment" = {
"fg" = black.bright; fg = black.bright;
"modifiers" = [ "italic" ]; modifiers = [ "italic" ];
}; };
"constant" = accent.bright; "constant" = accent.bright;
"constant.character.escape" = special.bright; "constant.character.escape" = special.bright;
@@ -320,6 +321,7 @@
"hint" = tertiary.bright; "hint" = tertiary.bright;
"info" = foreground; "info" = foreground;
"keyword" = special.base; "keyword" = special.base;
"keyword.modifiers" = [ "italic" ];
"label" = foreground; "label" = foreground;
"namespace" = weird.bright; "namespace" = weird.bright;
"operator" = foreground; "operator" = foreground;
@@ -332,131 +334,127 @@
"markup.heading" = accent.base; "markup.heading" = accent.base;
"markup.bold" = { "markup.bold" = {
"fg" = tertiary.bright; fg = tertiary.bright;
"modifiers" = [ "bold" ]; modifiers = [ "bold" ];
}; };
"italic" = { "italic" = {
"fg" = secondary.bright; fg = secondary.bright;
"modifiers" = [ "italic" ]; modifiers = [ "italic" ];
}; };
"markup.linktext" = accent.base; "markup.linktext" = accent.base;
"markup.linkurl" = { "markup.linkurl" = {
"fg" = tertiary.dark; fg = tertiary.dark;
"modifiers" = [ "underlined" ]; modifiers = [ "underlined" ];
}; };
"markup.list" = accent.bright; "markup.list" = accent.bright;
"markup.quote" = weird.bright; "markup.quote" = weird.bright;
"markup.raw" = special.bright; "markup.raw" = special.bright;
"markup.strikethrough" = { "markup.strikethrough".modifiers = [ "crossed_out" ];
"modifiers" = [ "crossed_out" ];
};
"diagnostic.hint" = { "diagnostic.hint".underline.style = "curl";
"underline" = { style = "curl"; }; "diagnostic.info".underline.style = "curl";
}; "diagnostic.warning".underline.style = "curl";
"diagnostic.info" = { "diagnostic.error".underline.style = "curl";
"underline" = { style = "curl"; };
};
"diagnostic.warning" = {
"underline" = { style = "curl"; };
};
"diagnostic.error" = {
"underline" = { style = "curl"; };
};
"ui.background" = { # general background of the editor window "ui.background" = { # general background of the editor window
# "bg" = background; # bg = background;
}; };
"ui.bufferline" = { # the top line ("tab"-line) "ui.bufferline" = { # the top line ("tab"-line)
"fg" = accent.base; fg = accent.base;
"bg" = black.base; bg = black.base;
}; };
"ui.bufferline.active" = { # the active "tab" "ui.bufferline.active" = { # the active "tab"
"fg" = background; fg = background;
"bg" = accent.base; bg = accent.base;
"modifiers" = [ "bold" ]; modifiers = [ "bold" ];
}; };
"ui.cursor" = { # the cursor in Normal mode "ui.cursor" = { # the cursor in Normal mode
"fg" = foreground; fg = foreground;
"modifiers" = [ "reversed" ]; modifiers = [ "reversed" ];
}; };
"ui.cursorline.primary" = { # the line on which the cursor is on "ui.cursorline.primary" = { # the line on which the cursor is on
"bg" = black.base; bg = black.base;
}; };
"ui.cursor.match" = { # Matching bracket etc. "ui.cursor.match" = { # Matching bracket etc.
"bg" = green.dark; bg = green.dark;
"modifiers" = [ ]; modifiers = [ ];
}; };
"ui.gutter" = { "ui.gutter" = {
"bg" = black.base; bg = black.base;
}; };
"ui.help" = { "ui.help" = {
"fg" = green.base; fg = green.base;
"bg" = black.base; bg = black.base;
}; };
"ui.linenr" = { "ui.linenr" = {
"fg" = white.dark; fg = white.dark;
"bg" = black.base; bg = black.base;
}; };
"ui.linenr.selected" = { "ui.linenr.selected" = {
"fg" = accent.bright; fg = accent.bright;
"modifiers" = [ "bold" ]; modifiers = [ "bold" ];
}; };
"ui.menu" = { "ui.menu" = {
"fg" = accent.base; fg = accent.base;
"bg" = black.base; bg = black.base;
}; };
"ui.menu.scroll" = { "ui.menu.scroll" = {
"fg" = yellow.dark; fg = yellow.dark;
"bg" = background; bg = background;
}; };
"ui.menu.selected" = { "ui.menu.selected" = {
"fg" = red.base; fg = red.base;
"bg" = blue.dark; bg = blue.dark;
}; };
"ui.popup" = { "ui.popup" = {
"bg" = black.base; bg = black.base;
}; };
"ui.selection" = { "ui.selection" = {
"bg" = white.dark; bg = white.dark;
}; };
"ui.selection.primary" = { "ui.selection.primary" = {
"bg" = black.bright; bg = black.bright;
}; };
"ui.statusline" = { "ui.statusline" = {
"fg" = blue.bright; fg = blue.bright;
"bg" = black.base; bg = black.base;
}; };
"ui.statusline.inactive" = { "ui.statusline.inactive" = {
"fg" = red.bright; fg = red.bright;
"bg" = red.dark; bg = red.dark;
}; };
"ui.statusline.insert" = { "ui.statusline.insert" = {
"fg" = green.bright; fg = green.bright;
"bg" = green.dark; bg = green.dark;
}; };
"ui.statusline.normal" = { "ui.statusline.normal" = {
"fg" = yellow.bright; fg = yellow.bright;
"bg" = yellow.dark; bg = yellow.dark;
}; };
"ui.statusline.select" = { "ui.statusline.select" = {
"fg" = cyan.bright; fg = cyan.bright;
"bg" = cyan.dark; bg = cyan.dark;
}; };
"ui.text" = foreground; "ui.text" = foreground;
"ui.text.focus" = accent.base; "ui.text.focus" = accent.base;
"ui.virtual.indent-guide" = { "ui.virtual.indent-guide" = {
"fg" = black.bright; fg = black.bright;
}; };
"ui.virtual.inlay-hint" = { "ui.virtual.inlay-hint" = {
"fg" = weird.dark; fg = weird.dark;
"bg" = weird.base; bg = weird.base;
}; };
"ui.virtual.ruler" = { "ui.virtual.ruler" = {
"bg" = background; bg = background;
};
"ui.virtual.jump-label" = {
fg = special.base;
underline = {
style = "dotted";
};
}; };
"ui.window" = { "ui.window" = {
"bg" = black.base; bg = black.base;
}; };
}; };
}; };

View File

@@ -13,7 +13,7 @@ let
scale = "1.0"; scale = "1.0";
}; };
second = { second = {
name = "DP-1"; name = "DP-3";
resolution = "1920x1080"; resolution = "1920x1080";
position = "0x0"; position = "0x0";
scale = "1.0"; scale = "1.0";

View File

@@ -9,12 +9,12 @@
Port 50022 Port 50022
HOST nxacel HOST nxacel
HostName 192.168.178.32 HostName 10.0.1.1
User nx2 User nx2
Port 50022 Port 50022
HOST nxrpil HOST nxrpil
HostName 192.168.178.31 HostName 10.0.1.31
User nx2 User nx2
Port 22 Port 22

View File

@@ -47,104 +47,113 @@ in {
'';}) '';})
(writers.writePython3Bin "caldav_event" { (writers.writePython3Bin "caldav_event" {
libraries = with pkgs.python3Packages; [ caldav ics pytz ]; libraries = with pkgs.python3Packages; [ caldav ics pytz ];
flakeIgnore = [ "E302" "E305""E501" ]; flakeIgnore = [ "E302" "E305""E501" "E261" ];
} /* python */ '' } /* python */ ''
import os import os
import json
from caldav import DAVClient from caldav import DAVClient
from datetime import datetime, timezone from datetime import datetime, timezone
import json
from ics import Calendar from ics import Calendar
from pytz import UTC
def get_password(password_file): def get_password(password_file):
with open(password_file, "r") as file: with open(password_file, "r") as file:
return file.read().strip() return file.read().strip()
def datetime_converter(obj):
if isinstance(obj, datetime):
return obj.isoformat()
return obj
def datetime_parser(dct):
for key, value in dct.items():
if isinstance(value, str):
try:
dct[key] = datetime.fromisoformat(value)
except ValueError:
pass
return dct
def load_cache(cache_file): def load_cache(cache_file):
if os.path.exists(cache_file): if os.path.exists(cache_file):
with open(cache_file, "r") as file: with open(cache_file, "r") as file:
return json.load(file) return json.load(file, object_hook=datetime_parser)
return None return None
def save_cache(cache_file, data): def save_cache(cache_file, data):
with open(cache_file, "w") as file: with open(cache_file, "w") as file:
json.dump(data, file) json.dump(data, file, default=datetime_converter)
def get_ongoing_and_next_event(url, username, password):
def get_ongoing_or_next_event(url, username, password):
now = datetime.now(timezone.utc) now = datetime.now(timezone.utc)
ongoing_events = []
upcoming_events = []
try: try:
client = DAVClient(url, username=username, password=password) client = DAVClient(url, username=username, password=password)
principal = client.principal() principal = client.principal()
calendars = principal.calendars() calendars = principal.calendars()
next_event_dict = {
'event_name': "fake",
'event_begin': datetime(9000, 1, 1, tzinfo=UTC), # in the year 9000
'event_end': datetime(9000, 1, 1, 8, tzinfo=UTC),
}
for calendar in calendars: for calendar in calendars:
events = calendar.events() for event in calendar.events():
for event in events: calendar_parsed = Calendar(event.data)
ical_data = event.data for ics_event in calendar_parsed.events:
calendar_parsed = Calendar(ical_data) event_dict = {}
event_dict['event_name'] = ics_event.name or "(No Title)"
event_dict['event_begin'] = ics_event.begin.astimezone(timezone.utc)
event_dict['event_end'] = ics_event.end.astimezone(timezone.utc)
for event in calendar_parsed.events: if event_dict['event_begin'] <= now and now <= event_dict['event_end']:
event_name = event.name or "(No Title)" return event_dict
start_time = event.begin.astimezone(timezone.utc) elif event_dict['event_begin'] >= now and next_event_dict['event_begin'] > event_dict['event_begin']:
end_time = event.end.astimezone(timezone.utc) next_event_dict = event_dict
return next_event_dict
if start_time <= now <= end_time:
ongoing_events.append((event_name, start_time.timestamp(), end_time.timestamp()))
elif start_time > now:
upcoming_events.append((event_name, start_time.timestamp(), end_time.timestamp()))
except Exception as e: except Exception as e:
print(f"Error accessing {url}: {e}") print(f"Error accessing {url}: {e}")
return None
upcoming_events.sort(key=lambda x: x[1]) # Sort by start time
return ongoing_events, upcoming_events[0] if upcoming_events else None
if __name__ == "__main__": if __name__ == "__main__":
password_file = "${config.sops.secrets."nx2site/radicale/password".path}" # Path to password file password_file = "/home/nx2/.config/sops-nix/secrets/nx2site/radicale/password" # Path to password file
cache_file = "/tmp/caldav_event_cache.json" # Path to cache file cache_file = "/tmp/caldav_event_cache.json" # Path to cache file
url = "https://dav.${domain}/" url = "https://dav.${domain}/"
username = "${user}" username = "${user}"
password = get_password(password_file) password = get_password(password_file)
cache = load_cache(cache_file) event_dict = load_cache(cache_file)
now = datetime.now(timezone.utc).timestamp() now = datetime.now(timezone.utc).timestamp()
if cache and cache.get("next_event_start") and now < cache["next_event_start"]: if event_dict is None or event_dict['event_begin'].timestamp() <= now and now < event_dict['event_end'].timestamp():
ongoing_events = cache.get("ongoing_events", []) event_dict = get_ongoing_or_next_event(url, username, password)
next_event = (cache["next_event_name"], cache["next_event_start"], cache["next_event_end"]) if "next_event_name" in cache else None if event_dict is None:
else: print("No upcoming events found.")
ongoing_events, next_event = get_ongoing_and_next_event(url, username, password) exit(0)
cache_data = { cache_data = {
"ongoing_events": ongoing_events, "event_name": event_dict['event_name'] if event_dict is not None else None,
"next_event_name": next_event[0] if next_event else None, "event_begin": event_dict['event_begin'] if event_dict is not None else None,
"next_event_start": next_event[1] if next_event else None, "event_end": event_dict['event_end'] if event_dict is not None else None
"next_event_end": next_event[2] if next_event else None
} }
save_cache(cache_file, cache_data) save_cache(cache_file, cache_data)
if ongoing_events: if event_dict:
for event_name, start_time, end_time in ongoing_events: event_start = event_dict['event_begin'].timestamp()
time_remaining = end_time - now event_end = event_dict['event_end'].timestamp()
if event_start <= now <= event_end:
time_remaining = event_end - now
hours, rem = divmod(int(time_remaining), 3600) hours, rem = divmod(int(time_remaining), 3600)
minutes, _ = divmod(rem, 60) minutes, _ = divmod(rem, 60)
print(f"{event_dict['event_name']} ends in {hours} hour{'s ' if hours != 1 else ' '}and {minutes} minute{'s ' if minutes != 1 else ' '}")
if hours == 0:
print(f"{event_name} {minutes} minute{'s ' if minutes > 1 else ' '}left")
else: else:
print(f"{event_name} {hours} hour{'s ' if hours > 1 else ' '}and {minutes} minute{'s ' if minutes > 1 else ' '}left") time_until_start = event_start - now
else:
if next_event:
event_name, start_time, end_time = next_event
time_until_start = start_time - now
hours, rem = divmod(int(time_until_start), 3600) hours, rem = divmod(int(time_until_start), 3600)
minutes, _ = divmod(rem, 60) minutes, _ = divmod(rem, 60)
print(f"{event_dict['event_name']} starts in {hours} hour{'s ' if hours != 1 else ' '}and {minutes} minute{'s ' if minutes != 1 else ' '}")
if hours == 0:
print(f"'{event_name}' starts in {minutes} minute{'s ' if minutes > 1 else ' '}")
else:
print(f"'{event_name}' starts in {hours} hour{'s ' if hours > 1 else ' '}and {minutes} minute{'s ' if minutes > 1 else ' '}")
else: else:
print("No upcoming events found.") print("No upcoming events found.")
'') '')

View File

@@ -13,7 +13,9 @@
enableFishIntegration = true; enableFishIntegration = true;
shellWrapperName = "ya"; shellWrapperName = "ya";
plugins = with inputs.yazi-plugins.packages.${system}; { plugins = with inputs.yazi-plugins.packages.${system}; {
inherit chmod starship; inherit
# chmod
starship;
}; };
# initLua = /* lua */ '' ''; # initLua = /* lua */ '' '';
keymap = { keymap = {
@@ -44,10 +46,10 @@
{ on = [ "g" "C" ]; run = "cd ~/.cache"; desc = "Go to the .cache directory"; } { on = [ "g" "C" ]; run = "cd ~/.cache"; desc = "Go to the .cache directory"; }
{ on = [ "g" "m" ]; run = "cd ~/media"; desc = "Go to the media (udiskie mount) directory"; } { on = [ "g" "m" ]; run = "cd ~/media"; desc = "Go to the media (udiskie mount) directory"; }
{ on = [ "g" "v" ]; run = "cd ~/Videos"; desc = "Go to the Videos directory"; } { on = [ "g" "v" ]; run = "cd ~/Videos"; desc = "Go to the Videos directory"; }
{ on = [ "g" "t" ]; run = "cd /tmp"; desc = "Go to the /tmp directory"; }
{ on = [ "g" "d" ]; run = "cd ~/Downloads"; desc = "Go to the downloads directory"; } { on = [ "g" "d" ]; run = "cd ~/Downloads"; desc = "Go to the downloads directory"; }
{ on = [ "g" "D" ]; run = "cd ~/Documents"; desc = "Go to the Documents directory"; } { on = [ "g" "D" ]; run = "cd ~/Documents"; desc = "Go to the Documents directory"; }
{ on = [ "g" "r" ]; run = "cd /"; desc = "Go to the root (/) directory"; } { on = [ "g" "r" ]; run = "cd /"; desc = "Go to the root (/) directory"; }
{ on = [ "g" "t" ]; run = "cd /tmp"; desc = "Go to the /tmp directory"; }
{ on = [ "g" "/" ]; run = "cd /"; desc = "Go to the root (/) directory"; } { on = [ "g" "/" ]; run = "cd /"; desc = "Go to the root (/) directory"; }
{ on = [ "g" "<Space>" ]; run = "cd --interactive"; desc = "Go to a directory interactively"; } { on = [ "g" "<Space>" ]; run = "cd --interactive"; desc = "Go to a directory interactively"; }
# Navigation # Navigation
@@ -112,7 +114,7 @@
{ on = "?"; run = "find --previous --smart"; desc = "Find previous file"; } { on = "?"; run = "find --previous --smart"; desc = "Find previous file"; }
{ on = "n"; run = "find_arrow"; desc = "Go to the next found"; } { on = "n"; run = "find_arrow"; desc = "Go to the next found"; }
{ on = "N"; run = "find_arrow --previous"; desc = "Go to the previous found"; } { on = "N"; run = "find_arrow --previous"; desc = "Go to the previous found"; }
# Sortin # Sorting
{ on = [ "," "m" ]; run = [ "sort modified --reverse=no" "linemode mtime" ]; desc = "Sort by modified time"; } { on = [ "," "m" ]; run = [ "sort modified --reverse=no" "linemode mtime" ]; desc = "Sort by modified time"; }
{ on = [ "," "M" ]; run = [ "sort modified --reverse" "linemode mtime" ]; desc = "Sort by modified time (reverse)"; } { on = [ "," "M" ]; run = [ "sort modified --reverse" "linemode mtime" ]; desc = "Sort by modified time (reverse)"; }
{ on = [ "," "c" ]; run = [ "sort created --reverse=no" "linemode ctime" ]; desc = "Sort by created time"; } { on = [ "," "c" ]; run = [ "sort created --reverse=no" "linemode ctime" ]; desc = "Sort by created time"; }
@@ -173,7 +175,7 @@
{ on = "u"; run = "arrow -5"; desc = "Up in list (fast)"; } { on = "u"; run = "arrow -5"; desc = "Up in list (fast)"; }
{ on = "d"; run = "arrow 5"; desc = "Down in list (fast)"; } { on = "d"; run = "arrow 5"; desc = "Down in list (fast)"; }
]; ];
help = [ help.keymap = [
# Help # Help
{ on = "~"; run = "help"; desc = "Open help"; } { on = "~"; run = "help"; desc = "Open help"; }
{ on = "?"; run = "help"; desc = "Open help"; } { on = "?"; run = "help"; desc = "Open help"; }

View File

@@ -108,6 +108,7 @@
spicetify-cli spicetify-cli
sssnake sssnake
swww swww
systemctl-tui
tldr tldr
w3m w3m
wev wev
@@ -120,11 +121,11 @@
inputs.zen-browser.packages."${system}".default inputs.zen-browser.packages."${system}".default
] ++ (with pkgs-unstable; [ ] ++ (with pkgs-unstable; [
obsidian
firefox firefox
spotify spotify
]) ++ (if host != "NxACE" then (with pkgs; [ ]) ++ (if host != "NxACE" then (with pkgs; [
signal-desktop signal-desktop
obsidian
zoom-us zoom-us
inkscape inkscape
]) else (with pkgs-unstable; [ ]) else (with pkgs-unstable; [

View File

@@ -23,6 +23,7 @@ nx2site:
cloudflare: cloudflare:
api-token-dns-edit: ENC[AES256_GCM,data:fR4fH6NqwtHI8aebEwjUn5JMoy3q3GXgu/dREe8JK7yRBIOhJ8BKuw==,iv:fQqLRYCN/7zhpHzYxMcn8q1aA7x4qd3qWGgrFWn2E/U=,tag:GJ1muJG755ch/84Sgcf2Vw==,type:str] api-token-dns-edit: ENC[AES256_GCM,data:fR4fH6NqwtHI8aebEwjUn5JMoy3q3GXgu/dREe8JK7yRBIOhJ8BKuw==,iv:fQqLRYCN/7zhpHzYxMcn8q1aA7x4qd3qWGgrFWn2E/U=,tag:GJ1muJG755ch/84Sgcf2Vw==,type:str]
global-api-key: ENC[AES256_GCM,data:7WBmyEYFG0jEkxeiF9H4isfrCrn7Uv21hEJgX5i2/fOu3+evZA==,iv:IicsZo7qMG3xOKVr8lHzsOu2pTaDKUSx+85SyehDe20=,tag:nQ+CWX2kEmk3vIH4pi6Vlw==,type:str] global-api-key: ENC[AES256_GCM,data:7WBmyEYFG0jEkxeiF9H4isfrCrn7Uv21hEJgX5i2/fOu3+evZA==,iv:IicsZo7qMG3xOKVr8lHzsOu2pTaDKUSx+85SyehDe20=,tag:nQ+CWX2kEmk3vIH4pi6Vlw==,type:str]
global-api-key-env: ENC[AES256_GCM,data:eb+Lg4R39VBNKG+NpH4n51E9MwMcW0Qm8x9cQZ4o/MnggZrAAR6wVOhzq8fCb0hB7CrIkPBcIS78044=,iv:MmGpDBC6uDOQ3cF4H2SvWXceBLxPyk42udSwe5jboBc=,tag:GP02DUCyQevfryhrO6py0w==,type:str]
sslCertificate.pem: ENC[AES256_GCM,data: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,iv:r4vqXNMieiy9+E1ZIknUxQtxgEoZh7zSSrJ0yS5KQUs=,tag:AYX7RayP3dmNgUnkytQg7Q==,type:str] sslCertificate.pem: ENC[AES256_GCM,data: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,iv:r4vqXNMieiy9+E1ZIknUxQtxgEoZh7zSSrJ0yS5KQUs=,tag:AYX7RayP3dmNgUnkytQg7Q==,type:str]
sslCertificateKey.pem: ENC[AES256_GCM,data:Wzmi17UA4mpCr4VaUolfKwZJEZ5K9Ybp2/K3noC/D/QYlgJfwWnQEoXDfLj3lVVnz0V/m71NAtZ9p3/jhiQCyIwt0cOmsAmd1isHf0KQwGagc8cHttwDeZT7AzLW4axqevpZM8bjVk/TJ/k+uGbArqSwgu2W7C77uCltSS8AydWzD2D7eQciDZzQ4yyHShW9f0SH8Q/wumuY4ksjLs4roYtQgtr1ezUb1U329xA1y81apd47RHviJ/moOBQYY2Y8fbNryUmfqvGYtsfXxmNElJpGAStqjBCo0bncOetP+bfj90CJlbkIn1JzcPOa5ZJjDg==,iv:28PcaWyOsQ8gN6qvZYDS3H4lKKlU7ihxxLUXMYgHPEY=,tag:6t+jvoAZkYlqg/2d8V5Emw==,type:str] sslCertificateKey.pem: ENC[AES256_GCM,data:Wzmi17UA4mpCr4VaUolfKwZJEZ5K9Ybp2/K3noC/D/QYlgJfwWnQEoXDfLj3lVVnz0V/m71NAtZ9p3/jhiQCyIwt0cOmsAmd1isHf0KQwGagc8cHttwDeZT7AzLW4axqevpZM8bjVk/TJ/k+uGbArqSwgu2W7C77uCltSS8AydWzD2D7eQciDZzQ4yyHShW9f0SH8Q/wumuY4ksjLs4roYtQgtr1ezUb1U329xA1y81apd47RHviJ/moOBQYY2Y8fbNryUmfqvGYtsfXxmNElJpGAStqjBCo0bncOetP+bfj90CJlbkIn1JzcPOa5ZJjDg==,iv:28PcaWyOsQ8gN6qvZYDS3H4lKKlU7ihxxLUXMYgHPEY=,tag:6t+jvoAZkYlqg/2d8V5Emw==,type:str]
dhparams.pem: ENC[AES256_GCM,data:wGIUlT8QHruxHvrlaUdEDU3aKkB5hvQLZXic1ryKr1hIFw9uOv1hOCOPY+QUDBzfm+DXv62hTFAeq4siAoZ0wWvQ0uBuSZZBGrfuY1ZTsTJmpgTphdHi+S4/kl/Vt7nuBlvdW8VbwU+mzmSK4UuIjuvAl0RI+q9C/BAu0tsXvKfaCkrbYwSi6pdPjToEoATPWfuCdkZUulENBIdBkTLZ6F97fgNgsXub2xOEIRxqFAzg3G2nO3Mn7rSRRJraZNIsHgBTYpSNcijDBwZpgYKjcKsochYUNzVrCuLOu5xJPUU87pmd+Rup2hpMfWyK0xtUjncvHyfctEZANqfo+RdEBg81n1WHkFb1WnWUsRh8RmcVZuA9skI5S7Xhp4L2B5IKn0XGnKLG3og9iYb9tDVQys4o5/68+jjxdm51fmRYo3FvghnyFCYkQ/tm+ClCcRSPocYDrfSf0Rvg2v9nPmMj0IrEHlzVnafiJgp3VjI9cYLNW2wKiwf0Z8dWkrtnS8G7p072+w0fklmvLrdvlLZduAwrY6gS2nMbPUz1AwjAoMmQi7sFmbkP6M/PmkVV+hNP7T9ntmC4BQr2k5/3gKZPOEPO/xeMLlla68QpDVxU06NhC0Z3d5t3YY0wIVISNZXi4fgQO0G5nvFpPyyWCvvg39gulyAwUJfFQ3erNNFTjJe7X9RjqoJvjTgFm4IaYcL64Cr49KDu6Za01g492rBCEL842o3lVmZSqOYCG3UEEsSwOxn2iROZKgorZ5dyd1n1WevM+pKTUAaucy52iLJGLISRAVv82ZkmbS5L4zMHkYxVjUnqrYIZsk6+7sRHIQ31E0YtUFdMjRYUcOwfR1u+Ox+zV1NawpKjsuhKl+DRN+Q1TXUdEumUU1pDHT/RXtNHsyYOgeCBbTs93kdhFcHgO0dh5Ou/2N8EcTzWwAYd/qyE3wMZZTggTb44xwu6h0XhaLtnAk2lZ4vXwSaozf+Vq/uxAvYLxrhx6ujKVyX/O053YsKqOPKerYoN17uO8PrKoA==,iv:e0RPF9ZtzSRBRzMtWTWY3AVGsMXxvldA2HjiW9hf97Q=,tag:eb9ACnuGR+8eqncWoKQ/pw==,type:str] dhparams.pem: ENC[AES256_GCM,data:wGIUlT8QHruxHvrlaUdEDU3aKkB5hvQLZXic1ryKr1hIFw9uOv1hOCOPY+QUDBzfm+DXv62hTFAeq4siAoZ0wWvQ0uBuSZZBGrfuY1ZTsTJmpgTphdHi+S4/kl/Vt7nuBlvdW8VbwU+mzmSK4UuIjuvAl0RI+q9C/BAu0tsXvKfaCkrbYwSi6pdPjToEoATPWfuCdkZUulENBIdBkTLZ6F97fgNgsXub2xOEIRxqFAzg3G2nO3Mn7rSRRJraZNIsHgBTYpSNcijDBwZpgYKjcKsochYUNzVrCuLOu5xJPUU87pmd+Rup2hpMfWyK0xtUjncvHyfctEZANqfo+RdEBg81n1WHkFb1WnWUsRh8RmcVZuA9skI5S7Xhp4L2B5IKn0XGnKLG3og9iYb9tDVQys4o5/68+jjxdm51fmRYo3FvghnyFCYkQ/tm+ClCcRSPocYDrfSf0Rvg2v9nPmMj0IrEHlzVnafiJgp3VjI9cYLNW2wKiwf0Z8dWkrtnS8G7p072+w0fklmvLrdvlLZduAwrY6gS2nMbPUz1AwjAoMmQi7sFmbkP6M/PmkVV+hNP7T9ntmC4BQr2k5/3gKZPOEPO/xeMLlla68QpDVxU06NhC0Z3d5t3YY0wIVISNZXi4fgQO0G5nvFpPyyWCvvg39gulyAwUJfFQ3erNNFTjJe7X9RjqoJvjTgFm4IaYcL64Cr49KDu6Za01g492rBCEL842o3lVmZSqOYCG3UEEsSwOxn2iROZKgorZ5dyd1n1WevM+pKTUAaucy52iLJGLISRAVv82ZkmbS5L4zMHkYxVjUnqrYIZsk6+7sRHIQ31E0YtUFdMjRYUcOwfR1u+Ox+zV1NawpKjsuhKl+DRN+Q1TXUdEumUU1pDHT/RXtNHsyYOgeCBbTs93kdhFcHgO0dh5Ou/2N8EcTzWwAYd/qyE3wMZZTggTb44xwu6h0XhaLtnAk2lZ4vXwSaozf+Vq/uxAvYLxrhx6ujKVyX/O053YsKqOPKerYoN17uO8PrKoA==,iv:e0RPF9ZtzSRBRzMtWTWY3AVGsMXxvldA2HjiW9hf97Q=,tag:eb9ACnuGR+8eqncWoKQ/pw==,type:str]
@@ -87,8 +88,8 @@ sops:
SHJLR3lvdlFiRmJuU25RUHFFTmpjamMKbzycdDvQBAuOiRROTZEQSnaXoPapz73L SHJLR3lvdlFiRmJuU25RUHFFTmpjamMKbzycdDvQBAuOiRROTZEQSnaXoPapz73L
yVS9EUP25FSx/sGqRqaCefbeaybuM1aso6LDnlomv4Bib7zjugWKSw== yVS9EUP25FSx/sGqRqaCefbeaybuM1aso6LDnlomv4Bib7zjugWKSw==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
lastmodified: "2025-01-31T18:19:08Z" lastmodified: "2025-03-07T17:02:01Z"
mac: ENC[AES256_GCM,data:RpbqXk0JclXNVcHs5jCHVaw59AwzCnfhGsxoQnOwNEYWnAxEC5b0fXtjIC6Od4ziPJkPzUtfHgBG9Ub+b+RL7LUMPmsPOZ8XxE16YTrr+athK1s07I8doON8UpIsGj+MP/quJgy9pb/AvReOce/5Qe8SZG4Lig68I3iqHYFsiJ4=,iv:Huc7dZQPkJ+aPBgfqxdhy+PRl+8520aZMmqBeNd/C2w=,tag:M897FVr8TfAx3zDaml69Ww==,type:str] mac: ENC[AES256_GCM,data:js375bjy8Z4ApUXbw4eIqNl5BBgeX2bwMFBCx63LNCsb56OlHyYobQGtL1CwcDGW/+hwVLJSxbEDwqzJiu5vQ/2Cp00nVwvumHrvqZi/Ka4r87uNd6psE4nMq6ROHP0kJm6STKqd6MDyuLRjfX5zrki7ZhYTWsYS90/d9SUHUj8=,iv:W3w1f7lkL3fuOWmNhLUsOTKG18+wLhWA04GjygDIUEc=,tag:AYy9O7OcsY2W4VbOzyM5oA==,type:str]
pgp: pgp:
- created_at: "2024-06-09T19:44:41Z" - created_at: "2024-06-09T19:44:41Z"
enc: |- enc: |-
@@ -103,4 +104,4 @@ sops:
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
fp: 22FB2CC03DC5292AB81CF67D0AF27B383170E634 fp: 22FB2CC03DC5292AB81CF67D0AF27B383170E634
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.9.2 version: 3.9.4

View File

@@ -103,7 +103,7 @@ in
''; '';
}; };
}; };
kernelPackages = pkgs-unstable.linuxPackages_6_11; kernelPackages = pkgs-unstable.linuxPackages_latest;
extraModulePackages = with config.boot.kernelPackages; [ v4l2loopback ]; extraModulePackages = with config.boot.kernelPackages; [ v4l2loopback ];
kernelModules = [ "v4l2loopback" ]; kernelModules = [ "v4l2loopback" ];
extraModprobeConfig = ''options v4l2loopback devices=1 video_nr=1 card_label="OBS VCam" exclusive_caps=1''; extraModprobeConfig = ''options v4l2loopback devices=1 video_nr=1 card_label="OBS VCam" exclusive_caps=1'';
@@ -118,7 +118,7 @@ in
efiSupport = true; efiSupport = true;
}; };
}; };
kernelPackages = pkgs-unstable.linuxPackages_6_11; kernelPackages = pkgs.linuxPackages; # default kernel of pkgs
}; };
}; };
} }

View File

@@ -56,7 +56,7 @@ def modify_event(event):
global latest_week global latest_week
global deficit global deficit
if event.name and "DICOS" in event.name: if event.name is not None and "DICOS" in event.name:
length = (event.end - event.begin).seconds / 3600 length = (event.end - event.begin).seconds / 3600
money_made = divmod(length * NETTO_STUNDE, 1) money_made = divmod(length * NETTO_STUNDE, 1)
@@ -78,9 +78,14 @@ def modify_event(event):
latest_goal = goal latest_goal = goal
latest_week = week latest_week = week
progress_line = f"({fraction_to_unicode(progress)}/{fraction_to_unicode(goal)})" new_description = [event.description.split("\n")[0] or "::"]
new_description.append("")
new_description.append(f"Netto: {money_made[0]:.0f},{int(money_made[1] * 10):02d}")
new_description.append(f"This weeks porgress: ({fraction_to_unicode(progress)}/{fraction_to_unicode(goal)})")
new_description.append(f"This weeks deficit: {fraction_to_unicode(deficit)}")
event.description = "\n".join(new_description)
event.description = f"Netto: {money_made[0]:.0f},{int(money_made[1] * 10):02d}\nThis weeks porgress: {progress_line}\nThis weeks deficit: {fraction_to_unicode(deficit)}"
event.name = f"DICOS {fraction_to_unicode(length)}" event.name = f"DICOS {fraction_to_unicode(length)}"
return event return event
@@ -92,7 +97,7 @@ def process_ics_file(filepath):
modified = False modified = False
for event in calendar.events: for event in calendar.events:
if 'DICOS' in event.name: if event.name is not None and 'DICOS' in event.name:
event = modify_event(event) event = modify_event(event)
modified = True modified = True

View File

@@ -21,18 +21,10 @@
]; ];
flakeIgnore = [ "E302" "E305" "E226" "E501" ]; flakeIgnore = [ "E302" "E305" "E226" "E501" ];
} /*python */ '' } /*python */ ''
import hashlib
from ics import Calendar from ics import Calendar
import requests import requests
from datetime import timedelta from datetime import timedelta
def get_event_hash(event):
"""
Generate a unique hash for an event based on its details.
"""
event_data = f"{event.name}{event.begin}{event.end}{event.description}"
return hashlib.md5(event_data.encode('utf-8')).hexdigest()
def adjust_events(events): def adjust_events(events):
""" """
Adjust overlapping events to ensure they do not conflict. Adjust overlapping events to ensure they do not conflict.

View File

@@ -0,0 +1,74 @@
{ config, pkgs, domain, ... }:
{
systemd.timers."nx_cal_lr" = {
enable = true;
wantedBy = [ "timers.target" ];
timerConfig = {
OnBootSec = "41m";
OnUnitActiveSec = "24h";
Unit = "nx_cal_lr.service";
};
};
systemd.services."nx_cal_lr" = {
script = let
nx_cal_lr = (pkgs.writers.writePython3Bin "nx_cal_lr" {
libraries = with pkgs.python3Packages; [
ics
requests
];
flakeIgnore = [ "E302" "E305" "E226" "E501" ];
} /*python */ ''
from ics import Calendar
import requests
def filter_events(events):
return [event for event in events if ("LR" in event.name) or ("TBD" in event.name)]
def fetch_and_save_ical_events(ical_url, save_path):
"""
Fetch events from an iCal URL and save them as a single combined calendar.
"""
try:
# Fetch the iCal data
response = requests.get(ical_url)
response.raise_for_status()
# Parse the iCal data
calendar = Calendar(response.text)
# Adjust events
adjusted_events = filter_events(list(calendar.events))
# Create a new combined calendar
combined_calendar = Calendar()
for event in adjusted_events:
combined_calendar.events.add(event)
# Save the combined calendar to a single .ics file
with open(save_path, 'w') as file:
file.writelines(combined_calendar.serialize_iter())
print(f"Saved combined calendar to {save_path}")
except requests.exceptions.RequestException as e:
print(f"Error fetching iCal data: {e}")
except Exception as e:
print(f"Error processing iCal data: {e}")
if __name__ == "__main__":
# Replace with your iCal URL and target file path
ICAL_URL = "https://zlypher.github.io/lol-events/cal/league-of-legends-nlc.ical"
SAVE_PATH = "${config.services.nginx.virtualHosts."${domain}".root}/lr.ics"
fetch_and_save_ical_events(ICAL_URL, SAVE_PATH)
'');
in ''
${nx_cal_lr}/bin/nx_cal_lr
'';
serviceConfig = {
Type = "oneshot";
User = "nx2";
};
};
}

View File

@@ -1,4 +1,4 @@
{ pkgs, pkgs-unstable, ... }: { pkgs, ... }:
{ {
# i18n.inputMethod = { # i18n.inputMethod = {
# type = "fcitx5"; # type = "fcitx5";
@@ -10,7 +10,8 @@
# ]; # ];
# }; # };
i18n.inputMethod = { i18n.inputMethod = {
enabled = "fcitx5"; enable = true;
type = "fcitx5";
fcitx5.waylandFrontend = true; fcitx5.waylandFrontend = true;
fcitx5.addons = with pkgs; [ fcitx5.addons = with pkgs; [
fcitx5-gtk # alternatively, kdePackages.fcitx5-qt fcitx5-gtk # alternatively, kdePackages.fcitx5-qt

View File

@@ -1,5 +1,6 @@
{ lib, host, ... }: { lib, host, ... }:
lib.mkIf (host == "NxNORTH" || host == "NxACE") # lib.mkIf (host == "NxNORTH" || host == "NxACE")
lib.mkIf (host == "NxNORTH")
{ {
programs = { programs = {
steam = { steam = {

32
system-modules/hugo.nix Normal file
View File

@@ -0,0 +1,32 @@
{ pkgs-unstable, user, ... }:
let p = pkgs-unstable; in
{
environment.systemPackages = with p; [
hugo
dart-sass
];
users = {
groups = {
"hugo".name = "hugo";
};
users = {
"${user}".extraGroups = [ "hugo" ];
"nginx".extraGroups = [ "hugo" ];
"hugo" = {
isSystemUser = true;
group = "hugo";
};
};
};
systemd.services."hugo" = {
script = with p; /* shell */ ''
${hugo}/bin/hugo serve --port 8000 --bind 10.0.1.1 --baseURL http://10.0.1.1:8000 -s /var/lib/hugo/nx2site/
'';
serviceConfig = {
Type = "simple";
User = "hugo";
};
};
}

View File

@@ -17,6 +17,8 @@
firewall.allowedTCPPorts = [ firewall.allowedTCPPorts = [
80 80
443 443
8000
8080
]; ];
}; };
environment.etc = { environment.etc = {

View File

@@ -24,7 +24,7 @@ let dns-user = "cloudflare"; in
timers."dynamic-dns" = { timers."dynamic-dns" = {
wantedBy = [ "timers.target" ]; wantedBy = [ "timers.target" ];
timerConfig = { timerConfig = {
OnBootSec = "2m"; OnBootSec = "1m";
OnUnitActiveSec = "10m"; OnUnitActiveSec = "10m";
Unit = "dynamic-dns.service"; Unit = "dynamic-dns.service";
}; };
@@ -49,11 +49,13 @@ let dns-user = "cloudflare"; in
} /* python */ '' } /* python */ ''
import requests import requests
import subprocess import subprocess
from time import sleep
def get_public_ip(ipv6: bool = False) -> str: def get_public_ip(ipv6: bool = False) -> str:
return subprocess.run(['${pkgs.curl}/bin/curl', '-s', '-6' if ipv6 else '-4', 'https://ifconfig.me'], capture_output=True, text=True).stdout.strip() return subprocess.run(['${pkgs.curl}/bin/curl', '-s', '-6' if ipv6 else '-4', 'https://ifconfig.me'], capture_output=True, text=True).stdout.strip()
def update_record(record_id: str, record_name: str, ip: str, type: str, proxied: bool, pw: str) -> None: def update_record(record_id: str, record_name: str, ip: str, type: str, proxied: bool, pw: str) -> None:
sleep(5)
return requests.patch( return requests.patch(
f'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/{record_id}', f'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/{record_id}',
headers={ headers={
@@ -82,19 +84,13 @@ def main():
# Perform DNS updates # Perform DNS updates
# https://developers.cloudflare.com/api/operations/dns-records-for-a-zone-update-dns-record # https://developers.cloudflare.com/api/operations/dns-records-for-a-zone-update-dns-record
r = update_record(record_id="${record_id.base}", record_name="${domain}", ip=my_ip, type="A", proxied=True, pw=pw) print(f"${domain}: {update_record(record_id="${record_id.base}", record_name="${domain}", ip=my_ip, type="A", proxied=True, pw=pw).status_code}")
_ = update_record(record_id="${record_id.sub}", record_name="*.${domain}", ip=my_ip, type="A", proxied=True, pw=pw) print(f"*.${domain}: {update_record(record_id="${record_id.sub}", record_name="*.${domain}", ip=my_ip, type="A", proxied=True, pw=pw).status_code}")
_ = update_record(record_id="${record_id.ssh}", record_name="ssh.${domain}", ip=my_ip, type="A", proxied=False, pw=pw) print(f"ssh.${domain}: {update_record(record_id="${record_id.ssh}", record_name="ssh.${domain}", ip=my_ip, type="A", proxied=False, pw=pw).status_code}")
if r.status_code != 200: print(f"${domain}: {update_record(record_id="${record_id.base6}", record_name="${domain}", ip=my_ip6, type="AAAA", proxied=True, pw=pw).status_code}")
print(r.text) print(f"*.${domain}: {update_record(record_id="${record_id.sub6}", record_name="*.${domain}", ip=my_ip6, type="AAAA", proxied=True, pw=pw).status_code}")
print(f"ssh.${domain}: {update_record(record_id="${record_id.ssh6}", record_name="ssh.${domain}", ip=my_ip6, type="AAAA", proxied=False, pw=pw).status_code}")
r = update_record(record_id="${record_id.base6}", record_name="${domain}", ip=my_ip6, type="AAAA", proxied=True, pw=pw)
_ = update_record(record_id="${record_id.sub6}", record_name="*.${domain}", ip=my_ip6, type="AAAA", proxied=True, pw=pw)
_ = update_record(record_id="${record_id.ssh6}", record_name="ssh.${domain}", ip=my_ip6, type="AAAA", proxied=False, pw=pw)
if r.status_code != 200:
print(r.text)
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -0,0 +1,22 @@
{ config, pkgs, domain, ... }:
{
sops.secrets = {
# "nx2site/namecheap.pw" = { };
# "nx2site/cloudflare/api-token-dns-edit" = { };
"nx2site/cloudflare/global-api-key-env" = {
owner = "root";
};
};
services.cloudflare-dyndns = {
enable = true;
ipv4 = true;
ipv6 = config.networking.enableIPv6;
domains = [
"${domain}"
"*.${domain}"
"ssh.${domain}"
];
proxied = true;
apiTokenFile = config.sops.secrets."nx2site/cloudflare/global-api-key-env".path;
};
}

View File

@@ -14,7 +14,7 @@
}; };
certs = { certs = {
"${domain}" = { "${domain}" = {
extraDomainNames = builtins.map (subd: "${subd}.${domain}") [ "sync" ]; extraDomainNames = builtins.map (subd: "${subd}.${domain}") [ "sync" "dev" ];
}; };
}; };
}; };
@@ -145,10 +145,21 @@
# }; # };
"abs.${domain}" = vh // { "abs.${domain}" = vh // {
listen = dl; listen = dl;
locations = { "/" = { locations."/" = {
proxyPass = "http://127.0.0.1:${builtins.toString config.services.audiobookshelf.port}"; proxyPass = "http://127.0.0.1:${builtins.toString config.services.audiobookshelf.port}";
proxyWebsockets = true; proxyWebsockets = true;
}; }; };
};
"dev.${domain}" = vh // {
listen = dl ++ [
# { addr = "0.0.0.0"; port = 8000; ssl = true; }
# { addr = "[::0]"; port = 8000; ssl = true; }
];
root = "/var/lib/hugo/nx2site/public";
# locations."/" = {
# proxyPass = "http://127.0.0.1:8000";
# proxyWebsockets = true;
# };
}; };
# is done atomatically # is done atomatically
# "cal.${domain}" = vh // { # "cal.${domain}" = vh // {

View File

@@ -1,17 +1,6 @@
{ pkgs, pkgs-unstable, pkgs-latest, lib, host, nvidia, ... }: { pkgs, lib, host, nvidia, ... }:
let let
p = pkgs-latest.ollama; p = if nvidia.enable then pkgs.ollama-cuda else pkgs.ollama;
# p = pkgs-unstable.ollama.overrideAttrs (oldAttrs: rec {
# inherit (oldAttrs) pname;
# version = "0.3.0";
# src = pkgs.fetchFromGitHub {
# owner = "ollama";
# repo = "ollama";
# rev = "v${version}";
# hash = "sha256-69CpRAggx6a1NJq+CA9QliXuUbDgC1ERRuA3y17KVAM=";
# fetchSubmodules = true;
# };
# });
in { in {
environment.systemPackages = [ p ]; environment.systemPackages = [ p ];