nixos-config/system/desktop/wtf.nix

409 lines
9.8 KiB
Nix
Raw Normal View History

2020-01-06 14:36:38 +01:00
{ pkgs, lib, config, ... }:
let
unstable = import <nixpkgs-unstable> { };
2020-01-07 04:32:19 +01:00
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
'';
2020-01-07 03:44:59 +01:00
taskNextWeek = pkgs.writers.writeDash "taskweek" ''
${pkgs.taskwarrior}/bin/task \
export \
2020-01-12 22:57:57 +01:00
status:pending and \( due.before:7days and due.after:today \) \
2020-01-07 03:44:59 +01:00
| ${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")'
'';
2020-01-06 14:36:38 +01:00
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);
2020-01-10 20:16:59 +01:00
# command runner module
cmdRunner = args@{ cmd, ... }:
wtfModule ({
type = "cmdrunner";
focusable = false;
refreshInterval = 300;
} // args);
modules = {
2020-01-10 20:16:59 +01:00
inherit cmdRunner;
2020-01-10 20:16:59 +01:00
# not working: had no time to investigate
#digitalclock = args@{ top, left, ... }:
# wtfModule ({
# type = "digitalclock";
# title = "";
# color = "white";
# font = "bigfont";
# hourFormat = 24;
# refreshInterval = 1;
# } // args);
digitalclock = args@{ top, left, ... }:
2020-01-10 20:16:59 +01:00
cmdRunner ({
cmd = pkgs.writers.writeDash "clock" ''
${pkgs.toilet}/bin/toilet --font future `${pkgs.coreutils}/bin/date +"%a %H:%M"`
${pkgs.coreutils}/bin/date +"%B %d %Y"
'';
title = "";
2020-01-10 20:16:59 +01:00
refreshInterval = 30;
} // 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);
2020-01-10 11:54:09 +01:00
feedreader = args@{ top, left, feeds, ... }:
wtfModule ({
type = "feedreader";
title = "";
2020-01-10 12:47:58 +01:00
refreshInterval = 3600;
2020-01-10 11:54:09 +01:00
focusable = true;
#feedLimit = 10;
colors.rows = {
even = "white";
odd = "white";
};
} // args);
github = args@{ top, left, username, apiKey, ... }:
wtfModule ({
type = "github";
title = "";
refreshInterval = 3600;
feedlimit = 10;
enableStatus = true;
# customQueries:
# othersPRs:
# title: "Others Pull Requests"
# filter: "is:open is:pr -author:wtfutil"
# repositories:
# - "wtfutil/wtf"
# - "wtfutil/docs"
# - "umbrella-corp/wesker-api"
} // args);
};
2020-01-10 11:54:09 +01:00
newsJson = {
2020-01-06 14:36:38 +01:00
wtf = {
term = "rxvt-unicode-256color";
colors.border = {
focusable = "darkslateblue";
focused = "orange";
normal = "green";
};
2020-01-10 11:54:09 +01:00
grid = {
2020-01-10 12:47:58 +01:00
columns = [ 28 0 0 ];
2020-01-10 11:54:09 +01:00
rows = [ 9 9 9 9 9 9 0 ];
};
refreshInterval = 1;
mods = with modules; {
2020-01-10 20:16:59 +01:00
clock = digitalclock {
2020-01-10 11:54:09 +01:00
top = 0;
left = 0;
};
weather = prettyweather {
top = 1;
left = 0;
};
# feeds
hackernews = feedreader {
title = "Hacker News";
top = 0;
left = 1;
2020-01-10 12:47:58 +01:00
height = 3;
2020-01-10 11:54:09 +01:00
feeds = [ "https://news.ycombinator.com/rss" ];
};
2020-01-10 12:47:58 +01:00
lopster = feedreader {
title = "Lopsters";
top = 0;
left = 2;
height = 3;
2020-01-10 20:16:59 +01:00
feeds = [ "https://lobste.rs/rss" ];
2020-01-10 12:47:58 +01:00
};
2020-01-10 20:16:59 +01:00
hackernews_tools = feedreader {
title = "Hacker News Tools";
top = 4;
left = 1;
height = 1;
feeds =
[ "https://latesthackingnews.com/category/hacking-tools/feed/" ];
};
2020-01-10 11:54:09 +01:00
nixos = feedreader {
title = "NixOS Weekly";
2020-01-10 12:47:58 +01:00
top = 3;
2020-01-10 11:54:09 +01:00
left = 1;
height = 1;
feeds = [ "https://weekly.nixos.org/feeds/all.rss.xml" ];
};
taskwarrior = feedreader {
title = "Taskwarrior";
top = 3;
2020-01-10 12:47:58 +01:00
left = 2;
2020-01-10 11:54:09 +01:00
height = 1;
feeds = [ "https://taskwarrior.org/feed.rss" ];
};
#github = github {
# username = "mrVanDalo";
# apiKey = "";
# repositories = [
# "nixos/nixpkgs"
# ];
#};
};
};
};
2020-01-06 14:36:38 +01:00
2020-01-10 11:54:09 +01:00
qJson = {
wtf = {
term = "rxvt-unicode-256color";
colors.border = {
focusable = "darkslateblue";
focused = "orange";
normal = "green";
};
2020-01-06 14:36:38 +01:00
grid = {
2020-01-07 03:44:59 +01:00
columns = [ 33 12 28 36 0 ];
2020-01-06 14:36:38 +01:00
rows = [ 9 3 7 6 0 ];
};
refreshInterval = 1;
mods = with modules; {
2020-01-06 14:36:38 +01:00
digitalclock = digitalclock {
top = 0;
left = 0;
2020-01-06 14:36:38 +01:00
};
clocks = clocks {
top = 1;
left = 0;
2020-01-06 14:36:38 +01:00
};
top = resourceusage {
top = 0;
left = 1;
2020-01-07 03:44:59 +01:00
width = 2;
2020-01-06 14:36:38 +01:00
};
power = power {
top = 2;
left = 0;
2020-01-06 14:36:38 +01:00
};
rates = wtfModule {
2020-01-06 14:36:38 +01:00
type = "exchangerates";
top = 3;
left = 0;
2020-01-06 14:36:38 +01:00
title = "rates";
2020-02-14 18:18:40 +01:00
rates.SGD = [ "EUR" ];
rates.EUR = [ "SGD" ];
2020-01-07 03:44:59 +01:00
refreshInterval = 3600;
2020-01-06 14:36:38 +01:00
};
weather = prettyweather {
top = 0;
2020-01-07 03:44:59 +01:00
left = 3;
2020-01-06 14:36:38 +01:00
};
calendar = cmdRunner {
2020-01-06 14:36:38 +01:00
title = "";
args = [ "-3" "--monday" "--color=never" "-w" ];
cmd = "cal";
top = 1;
left = 1;
height = 2;
2020-01-07 03:44:59 +01:00
width = 3;
2020-01-06 14:36:38 +01:00
refreshInterval = 3600;
};
active-users = cmdRunner {
2020-01-06 14:36:38 +01:00
title = "users";
cmd = activeUsers;
top = 0;
2020-01-07 03:44:59 +01:00
left = 4;
height = 4;
width = 1;
2020-01-06 14:51:12 +01:00
refreshInterval = 30;
2020-01-06 14:36:38 +01:00
};
active-tasks = cmdRunner {
2020-01-06 14:36:38 +01:00
title = "active tasks";
cmd = activeTasks;
top = 4;
2020-01-07 03:44:59 +01:00
left = 2;
height = 1;
width = 3;
refreshInterval = 60;
};
next-week-tasks = cmdRunner {
title = "upcoming";
cmd = taskNextWeek;
top = 4;
left = 0;
height = 1;
2020-01-07 03:44:59 +01:00
width = 2;
2020-01-06 14:51:12 +01:00
refreshInterval = 60;
2020-01-06 14:36:38 +01:00
};
2020-01-07 04:32:19 +01:00
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;
};
2020-01-06 14:36:38 +01:00
};
};
};
2020-01-10 11:54:09 +01:00
createDashboard = { json, name }:
let configuration = pkgs.writeText "config.yml" (builtins.toJSON json);
in pkgs.writers.writeBashBin name ''
${unstable.wtf}/bin/wtfutil --config=${toString configuration}
'';
2020-01-06 14:36:38 +01:00
in {
services.upower.enable = true;
environment.systemPackages = [
unstable.wtf
2020-01-10 11:54:09 +01:00
(createDashboard {
json = qJson;
name = "q";
})
(createDashboard {
json = newsJson;
name = "news";
})
2020-01-06 14:36:38 +01:00
#activeUsers
#activeTasks
pkgs.upower
];
}