nixos-config/system/desktop/wtf.nix

289 lines
6.7 KiB
Nix
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ pkgs, lib, config, ... }:
let
unstable = import <nixpkgs-unstable> { };
networkStatus = let
q-online = ''
if ${pkgs.curl}/bin/curl -s google.com >/dev/null; then
echo 'status: online'
else
echo 'status: offline '
fi
'';
q-wireless = ''
for dev in $(
${pkgs.iw}/bin/iw dev \
| ${pkgs.gnused}/bin/sed -n 's/^\s*Interface\s\+\([0-9a-z]\+\)$/\1/p'
); do
inet=$(${pkgs.iproute}/bin/ip addr show $dev \
| ${pkgs.gnused}/bin/sed -n 's/.*inet \([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p') \
|| unset inet
ssid=$(${pkgs.iw}/bin/iw dev $dev link \
| ${pkgs.gnused}/bin/sed -n 's/.*\tSSID: \(.*\)/\1/p' \
| ${pkgs.coreutils}/bin/tr -d '\r') \
|| unset ssid
printf '%s: %s %s\n' $dev ''${inet+ $inet} ''${ssid+ $ssid}
done
'';
in pkgs.writers.writeBash "network-status" ''
${q-wireless}
${q-online}
${pkgs.coreutils}/bin/uptime
'';
taskNextWeek = pkgs.writers.writeDash "taskweek" ''
${pkgs.taskwarrior}/bin/task \
export \
status:pending and \( due.before:6days \) \
| ${pkgs.jq}/bin/jq '[.[] | { Day: .due, ID: .id, Description: .description | sub("\n.*";"")} ] | sort_by(.Day)' \
| ${pkgs.miller}/bin/mlr --ijson --opprint put '$Day = strftime(strptime($Day,"%Y%m%dT%H%M%SZ")'$(date +%z)'00,"%a")'
'';
activeTasks = pkgs.writers.writeBash "active-tasks" ''
${pkgs.taskwarrior}/bin/task export +checklist status:pending +READY | \
${pkgs.jq}/bin/jq \
--raw-output '
sort_by(.description) | reverse |
.[] |
"[ \( .id ) ] \( .description )"
'
echo
${pkgs.taskwarrior}/bin/task export \
+ACTIVE status:pending \
| ${pkgs.jq}/bin/jq --raw-output '.[] | " \(.id) \(.description)"'
'';
userHighlight = map ({ user, ... }: user)
(builtins.attrValues config.programs.custom.browser.configList);
activeUsers = pkgs.writers.writeBash "active-users" ''
${pkgs.procps}/bin/ps -eo user \
| ${pkgs.gnused}/bin/sed '1 d' \
| ${pkgs.coreutils}/bin/sort \
| ${pkgs.coreutils}/bin/uniq \
| ${pkgs.gnugrep}/bin/egrep --color=always '(${
pkgs.lib.concatStringsSep "|" userHighlight
})|$'
'';
# default settings
wtfModule =
args@{ height ? 1, width ? 1, top, left, enabled ? true, type, ... }:
{
enabled = enabled;
focusable = false;
position.top = top;
position.left = left;
position.height = height;
position.width = width;
} // (lib.filterAttrs
(key: _: lib.all (x: x != key) [ "height" "width" "top" "left" ]) args);
modules = {
# command runner module
cmdRunner = args@{ cmd, ... }:
wtfModule ({
type = "cmdrunner";
focusable = false;
refreshInterval = 300;
} // args);
digitalclock = args@{ top, left, ... }:
wtfModule ({
type = "digitalclock";
title = "";
color = "white";
font = "bigfont";
hourFormat = 24;
refreshInterval = 1;
} // args);
clocks = args@{ top, left, ... }:
wtfModule ({
type = "clocks";
title = "";
border = false;
colors.rows = {
even = "white";
odd = "white";
};
locations = {
Berlin = "Europe/Berlin";
Wellington = "Pacific/Auckland";
};
sort = "alphabetical";
refreshInterval = 60;
} // args);
resourceusage = args@{ top, left, ... }:
wtfModule ({
type = "resourceusage";
title = "";
cpuCombined = false;
refreshInterval = 5;
} // args);
power = args@{ top, left, ... }:
wtfModule ({
type = "power";
title = "";
refreshInterval = 100;
} // args);
prettyweather = args@{ top, left, ... }:
wtfModule ({
type = "prettyweather";
title = "";
city = "Wellington";
unit = "m";
view = 0;
language = "en";
refreshInterval = 3600;
} // args);
};
qJson = {
wtf = {
term = "rxvt-unicode-256color";
colors.border = {
focusable = "darkslateblue";
focused = "orange";
normal = "green";
};
grid = {
columns = [ 33 12 28 36 0 ];
rows = [ 9 3 7 6 0 ];
};
refreshInterval = 1;
mods = with modules; {
digitalclock = digitalclock {
top = 0;
left = 0;
};
clocks = clocks {
top = 1;
left = 0;
};
top = resourceusage {
top = 0;
left = 1;
width = 2;
};
power = power {
top = 2;
left = 0;
};
rates = wtfModule {
type = "exchangerates";
top = 3;
left = 0;
title = "rates";
rates.NZD = [ "EUR" ];
rates.EUR = [ "NZD" ];
refreshInterval = 3600;
};
weather = prettyweather {
top = 0;
left = 3;
};
calendar = cmdRunner {
title = "";
args = [ "-3" "--monday" "--color=never" "-w" ];
cmd = "cal";
top = 1;
left = 1;
height = 2;
width = 3;
refreshInterval = 3600;
};
active-users = cmdRunner {
title = "users";
cmd = activeUsers;
top = 0;
left = 4;
height = 4;
width = 1;
refreshInterval = 30;
};
active-tasks = cmdRunner {
title = "active tasks";
cmd = activeTasks;
top = 4;
left = 2;
height = 1;
width = 3;
refreshInterval = 60;
};
next-week-tasks = cmdRunner {
title = "upcoming";
cmd = taskNextWeek;
top = 4;
left = 0;
height = 1;
width = 2;
refreshInterval = 60;
};
network-status = cmdRunner {
title = "network status";
cmd = networkStatus;
top = 3;
left = 1;
height = 1;
width = 3;
refreshInterval = 60;
};
uptime = cmdRunner {
enabled = false;
title = "uptime";
cmd = "uptime";
top = 3;
left = 1;
height = 1;
width = 3;
};
};
};
};
qConfig = pkgs.writeText "config.yml" (builtins.toJSON qJson);
q = pkgs.writers.writeBashBin "q" ''
${unstable.wtf}/bin/wtfutil --config=${toString qConfig}
'';
in {
services.upower.enable = true;
environment.systemPackages = [
unstable.wtf
q
#activeUsers
#activeTasks
pkgs.upower
];
}