1
0
mirror of https://github.com/kmein/niveum synced 2026-03-19 03:21:10 +01:00

220 Commits

Author SHA1 Message Date
704f745f5e try out whether new krops fixes the nixpkgs rebuilding issue 2022-02-16 09:11:10 +01:00
93dd8bd702 fix: less unstable, nixpkgs via krops git, NIX_PATH on makanek
systems wanted to build glibc all the time when updated
2022-02-15 22:16:50 +01:00
6e995764d4 chore: update horoscopy 2022-02-14 21:21:36 +01:00
87b9fc49ea feat(radio): opus streams 2022-02-14 08:14:15 +01:00
b4e42e6b22 feat: add horoscopy website 2022-02-14 08:02:08 +01:00
87f73a8fc1 fix(radio): clean up files after 1h 2022-02-10 19:28:34 +01:00
db8c06364f feat: wikipedia radio 2022-02-10 19:28:34 +01:00
24b7044a3f chore: update retiolum 2022-02-09 08:35:55 +01:00
908667267b feat: radio powered by liquidsoap 2022-02-08 00:47:10 +01:00
b3090737fd feat(grocy): disable 2022-02-07 12:59:34 +01:00
f195351474 feat(urlwatch): run later 2022-02-07 12:52:46 +01:00
1cce7dc8df feat: #hsmr moinbot 2022-02-07 11:44:29 +01:00
894cc6efef feat(polkit): dont need password for systemctl 2022-02-02 18:07:08 +01:00
f1ed00fe40 fix(traadfri): module scripts 2022-01-31 19:46:59 +01:00
7d1e1e712f feat(monitoring): simplify telegram alert message format 2022-01-31 09:33:24 +01:00
fd1c36874a feat(traadfri): no aliases but scripts 2022-01-31 09:33:04 +01:00
bc52a4a358 feat(traadfri): chain of lights 2022-01-30 22:47:54 +01:00
5aade69fbe fix(streams): remove defunct paradiso 2022-01-30 21:18:22 +01:00
0ead88d04a feat(git): bye hub 2022-01-30 20:58:37 +01:00
d21ff3e731 fix(ci): secrets for tuna 2022-01-28 14:25:32 +01:00
7a918319b7 fix(streams): di.fm 2022-01-28 12:54:12 +01:00
5524f3b92b feat: reactivate tuna 2022-01-28 12:54:12 +01:00
fe8af09148 feat(monitoring): improve messages 2022-01-28 09:04:40 +01:00
d9ca1e673d fix(flix): do not depend on wpa_supplicant 2022-01-27 18:27:34 +01:00
2efb8d7d8a feat(monitoring): streamline alerting 2022-01-27 17:47:33 +01:00
4e520a82aa Revert "feat(alertmanager): alert via irc"
This reverts commit 630d99e191.
2022-01-27 17:17:43 +01:00
62479936b1 feat(hu-berlin): split-tunnel via forti vpn 2022-01-27 16:54:22 +01:00
9419bb9bdd feat(i3): show which vpn is active 2022-01-27 16:45:51 +01:00
07b8813ae8 feat(prometheus): dont fail if no ssl 2022-01-27 15:49:36 +01:00
755105a428 feat(prometheus): monitor more URLs 2022-01-27 15:40:50 +01:00
ac75dcb826 feat(weechat): improve filter 2022-01-27 14:06:55 +01:00
76e22dba3c feat: bye bye russian keyboard 2022-01-26 20:54:05 +01:00
6b84a024a2 feat(i3): change rofi command 2022-01-26 20:54:05 +01:00
3f2fb3f5a3 feat(hu-berlin): prefer fortinet 2022-01-25 20:29:38 +01:00
40fa14d4a9 chore: update retiolum 2022-01-25 20:29:26 +01:00
272f2bdefe fix(restic): restart on failure 2022-01-24 09:17:04 +01:00
16b25d4890 feat(zaatar): mount restic disk via nixos 2022-01-23 16:46:32 +01:00
638751eb20 feat(rofi): theme 2022-01-23 16:40:54 +01:00
8b3a9be9fd feat(streams): add drachenhits 2022-01-23 16:40:47 +01:00
c3d94e5c49 fix(restic): remove tmp dir 2022-01-23 14:27:03 +01:00
13b8154a2b feat(weechat): smart filter, filter Mic92 gitlab 2022-01-23 14:27:03 +01:00
d17c3e942d feat: give rofi another chance 2022-01-23 14:27:03 +01:00
a8467cfb5a Revert "flake.lock: Update"
This reverts commit c417074b7d.

It wants to build `glibc` on all machines.
2022-01-23 08:56:48 +01:00
Kierán Meinhardt
4d9867a95d Merge pull request #2 from kmein/update_flake_lock_action
flake.lock: Update
2022-01-23 07:52:48 +01:00
github-actions[bot]
c417074b7d flake.lock: Update
Flake lock file changes:

• Updated input 'flake-utils':
    'github:numtide/flake-utils/74f7e4319258e287b0f9cb95426c9853b282730b' (2021-11-28)
  → 'github:numtide/flake-utils/846b2ae0fc4cc943637d3d1def4454213e203cba' (2022-01-20)
• Updated input 'home-manager':
    'github:nix-community/home-manager/697cc8c68ed6a606296efbbe9614c32537078756' (2021-12-18)
  → 'github:nix-community/home-manager/28b9ae40c45c5e7711c353fee1b7af734e293979' (2022-01-20)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/5d3420c1285073d5061a5d88a533b347d1222750' (2022-01-10)
  → 'github:NixOS/nixpkgs/3d35529a48d3ad50ad959463755b0b7fe392cfa7' (2022-01-22)
• Updated input 'nixpkgs-unstable':
    'github:NixOS/nixpkgs/bd20b7f07fd337b2e85420edd642382a2cc0196d' (2022-01-11)
  → 'github:NixOS/nixpkgs/e5f7e0e5513455fa128d13d82095016b2dcffc55' (2022-01-22)
• Updated input 'retiolum':
    'github:krebs/retiolum/be4a56463af13a7dab5fd12378bef3b0ec8ae99b' (2022-01-18)
  → 'github:krebs/retiolum/e3818e1a3af803f43f42e96e5629fceaf9a18011' (2022-01-20)
• Updated input 'stockholm':
    'git+https://cgit.lassul.us/stockholm?ref=master&rev=f67bd5783d6ed2be836c7714ea38cbb3f7ac7257' (2022-01-09)
  → 'git+https://cgit.lassul.us/stockholm?ref=master&rev=a3e67719b9da74e208c4058c42c0bd555c56b049' (2022-01-18)
2022-01-23 07:49:25 +01:00
9ca72a841d fix(restic): run restic as restic 2022-01-22 09:18:59 +01:00
7ec0586cf1 feat(restic): depend on connection to retiolum 2022-01-22 09:18:38 +01:00
6d681e9f43 feat(restic): more sensible times 2022-01-21 19:14:45 +01:00
c9248ae9b9 fix(vim): fugitive command 2022-01-19 13:51:30 +01:00
215bae0b9f fix(ci): add restic password 2022-01-19 13:37:01 +01:00
6f2aab721d chore: revert flake update
it had to build too many things and broke while doing it
2022-01-19 12:36:39 +01:00
1434290100 feat(i3): bye bye astrology 2022-01-19 12:27:14 +01:00
abcbd4dff9 Merge remote-tracking branch 'origin/update_flake_lock_action' 2022-01-19 11:07:08 +01:00
5dbe6b61d1 feat(restic): add wrapper on zaatar 2022-01-19 10:58:44 +01:00
0dc1e167fd feat(restic): backup moodle-dl 2022-01-19 09:41:14 +01:00
6f06f0c9ef feat(restic): add mount script 2022-01-19 09:38:19 +01:00
59894e2734 feat(restic): backup redis 2022-01-19 08:32:44 +01:00
f3835ebd5e feat(restic): backup regular systems 2022-01-19 00:48:15 +01:00
20da594f97 feat(restic): backup git 2022-01-18 23:36:38 +01:00
30c2bfe598 feat(restic): run on makanek, prometheus 2022-01-18 23:28:53 +01:00
bdc5c147dd chore: update retiolum 2022-01-18 23:19:50 +01:00
59c420e8b0 feat(restic): add wrapper command 2022-01-18 22:38:28 +01:00
efb8dff677 feat(git): bye diff-so-fancy, hello delta 2022-01-18 21:52:46 +01:00
7518c0f893 feat(weechat): max nix prefix 2022-01-18 21:30:52 +01:00
1b7e0f903d feat: restic 2022-01-18 21:29:30 +01:00
github-actions[bot]
0a8ab261f2 flake.lock: Update
Flake lock file changes:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/5d3420c1285073d5061a5d88a533b347d1222750' (2022-01-10)
  → 'github:NixOS/nixpkgs/610d4ea2750e064bf34b33fa38cb671edd893d3d' (2022-01-18)
• Updated input 'nixpkgs-unstable':
    'github:NixOS/nixpkgs/bd20b7f07fd337b2e85420edd642382a2cc0196d' (2022-01-11)
  → 'github:NixOS/nixpkgs/222f62ed88f67a1c9a7854b7e95bd9a5fe67b7ca' (2022-01-18)
• Updated input 'retiolum':
    'github:krebs/retiolum/4fcbe17549fa742a32e05b5f2ca57a983ad500c1' (2022-01-11)
  → 'github:krebs/retiolum/b62eba68b0836a2ea0b786b3738b281f070a3e04' (2022-01-18)
• Updated input 'stockholm':
    'git+https://cgit.lassul.us/stockholm?ref=master&rev=f67bd5783d6ed2be836c7714ea38cbb3f7ac7257' (2022-01-09)
  → 'git+https://cgit.lassul.us/stockholm?ref=master&rev=8d67a33709db13fade3460cc01f385f5bcffd794' (2022-01-15)
2022-01-18 18:26:45 +00:00
9a2205121b feat(ci): add github action to update flake inputs 2022-01-18 19:19:17 +01:00
4316c604f6 feat(i3): bye bye vaccinations 2022-01-18 18:31:34 +01:00
2ce0a6415f feat(streams): renew c3 lounge 2022-01-18 12:28:40 +01:00
fbbc9767a3 feat(stardict): improve renderer 2022-01-18 12:18:31 +01:00
356269caf7 feat(zaatar): enable spotifyd 2022-01-17 21:03:38 +01:00
a001a98f7b feat(weechat): more libera 2022-01-17 10:10:16 +01:00
2624bf0a50 feat: timer script 2022-01-17 10:10:16 +01:00
5186b7ac28 feat: lojban software 2022-01-15 08:21:42 +01:00
5497739980 feat(stardict): lojban 2022-01-14 19:59:06 +01:00
5bbb01d275 feat(locale): use en_DK, which uses ISO date 2022-01-14 19:26:46 +01:00
83837932af feat(weechat): real name is first name 2022-01-14 19:26:46 +01:00
72c88d0f38 feat(stardict): replace lsj and sa, shorten oed 2022-01-14 19:26:46 +01:00
ed646335f1 feat: IBM 3270 colors 2022-01-14 19:17:01 +01:00
310e9d8b46 feat(stardict): case-insensitive 2022-01-14 09:11:20 +01:00
a7efa8a822 feat(watson): configure WATSON_DIR 2022-01-14 08:30:33 +01:00
f9ceed1352 feat(stardict): use built-in coloring 2022-01-13 20:01:50 +01:00
630d99e191 feat(alertmanager): alert via irc 2022-01-13 19:29:19 +01:00
f0e11f3147 feat(stardict): better rendering 2022-01-13 18:05:46 +01:00
c651413768 feat(stardict): more sanskrit 2022-01-13 17:43:47 +01:00
ac7ddcfd1a feat(krops): copy instead of fetching on target 2022-01-12 23:00:41 +01:00
03c944affd feat(unicodmenu): kaomoji first 2022-01-12 21:36:26 +01:00
57f440ced5 feat(unicodmenu): get from unicode website 2022-01-12 18:02:59 +01:00
3528ffbda3 feat(urlwatch): disable telegram 2022-01-12 10:09:16 +01:00
237f7d7c96 feat(stardict): wrap 2022-01-12 10:00:33 +01:00
7f79744a13 feat(traadfri): add chain of lights 2022-01-12 08:17:53 +01:00
f2ff05c47e feat: reimplement ipa and betacode in haskell 2022-01-11 23:49:06 +01:00
a1b13206f1 chore: update retiolum 2022-01-11 23:19:17 +01:00
20fa2c9b08 feat(stardict): dont configure goldendict 2022-01-11 23:19:03 +01:00
ff098c1f97 feat: stable htmlq 2022-01-11 23:18:43 +01:00
2c03311dc2 feat(retiolum-map): add rrm.r alias 2022-01-11 23:13:17 +01:00
56bcc26ed6 feat: never underestimate espeak 2022-01-11 22:25:25 +01:00
2619e6e7b5 chore: update nixpkgs 2022-01-11 22:25:13 +01:00
85f170743b feat: mupdf 2022-01-11 20:05:25 +01:00
65532d7d47 feat: tocharian font 2022-01-11 19:56:31 +01:00
2aa19c28bd Revert "feat(zaatar): rip grocy"
This reverts commit 2e0765eede.
2022-01-11 12:07:51 +01:00
2e6a802f4a chore: update 2022-01-10 17:29:14 +01:00
08f0018e1f fix(zaatar): reenable nginx 2022-01-10 17:27:48 +01:00
cb4b9133c3 feat: no new planets in horoscope bot 2022-01-10 10:09:26 +01:00
b9a812962d feat: eyeD3 2022-01-08 10:18:43 +01:00
c243dc4cfd feat: dont clutter startup 2022-01-08 10:18:33 +01:00
230f6fab0c feat(flameshot-once): readd image uploader 2022-01-08 09:37:33 +01:00
9c16cc62bc feat: stardict renderer 2022-01-08 09:17:40 +01:00
18688f1441 chore: why did i have to do this 2022-01-08 09:17:28 +01:00
2e0765eede feat(zaatar): rip grocy 2022-01-07 18:27:49 +01:00
df461aa72d feat(makanek): rip containers 2022-01-07 17:23:28 +01:00
e76ed000cb feat(moodle-dl): dont run in container for borsfaye 2022-01-07 16:58:38 +01:00
a83e903488 chore: update nixpkgs
this should fix hedgedoc
2022-01-07 15:45:34 +01:00
7c36ea2995 chore: update stockholm 2022-01-06 22:28:16 +01:00
185f752de1 feat: add ttspaste script 2022-01-06 20:17:05 +01:00
6cb800f024 feat(klem): use tesseract for ocr 2022-01-06 20:16:54 +01:00
2217128f32 feat: all planets are beautiful 2022-01-06 00:14:19 +01:00
3ed79dbbfc feat(zaatar): rip bvg 2022-01-05 22:20:57 +01:00
6c7fa8c1b5 feat(zaatar): enable grocy 2022-01-05 21:49:27 +01:00
c36dc50369 feat(klem): add ocr 2022-01-05 21:37:36 +01:00
0656b0eaa3 feat: astro telegram bot sends live updates 2022-01-05 16:40:34 +01:00
5051938679 feat: astro telegram bot sends to channel 2022-01-05 14:49:04 +01:00
a3464f3328 feat: remove engiadina nginx 2022-01-05 11:46:48 +01:00
9b10c883a5 feat(pls): add msg command 2022-01-04 23:13:07 +01:00
7c42be3475 fix: names 2022-01-04 22:00:57 +01:00
bee1389d7f fix: global tmux wrecked weechat 2022-01-04 22:00:27 +01:00
508ed2f573 feat(vim): simplify 2022-01-04 21:42:39 +01:00
8b605d31a3 fix: astrology bot 2022-01-04 21:42:11 +01:00
8502b2966b chore: update stockholm 2022-01-03 11:50:50 +01:00
79b231e1b6 feat(watson): manage config 2022-01-03 11:49:24 +01:00
500a0741d3 chore: update stockholm 2022-01-03 11:49:24 +01:00
53b91eb522 feat(ci): do not depend on unneeded secrets 2022-01-03 11:14:58 +01:00
25d2294abc feat(stardict): start goldendict on startup 2022-01-03 11:14:43 +01:00
f0924d7d57 derp 2022-01-02 17:58:21 +01:00
9ebcf731df feat(stardict): fix georges, pape, add lingvo russian and coptic 2022-01-02 17:17:42 +01:00
49f3d9bdf1 feat(watson): symlink directory from cloud 2022-01-02 12:16:56 +01:00
4a56ba5bec chore: update retiolum 2022-01-02 12:16:56 +01:00
f4383937a8 feat(flameshot): configure 2022-01-02 12:16:56 +01:00
04a2c83eb8 feat: moon age instead of moon percentage 2021-12-31 19:43:10 +01:00
0e43cee95f chore: update stockholm 2021-12-31 18:39:54 +01:00
1405c2ca98 chore(flake): format 2021-12-31 17:26:15 +01:00
072c0a09df feat(krops): streamline inputs -> sources 2021-12-31 17:16:14 +01:00
a0fdfbef2b feat: get my repos via flake 2021-12-31 16:57:45 +01:00
a6792399f1 feat(ci): streamline definition 2021-12-31 16:42:22 +01:00
12cd6230fe chore(flake): unify naming 2021-12-31 16:26:30 +01:00
e800cca766 chore: remove unneeded stuff from flake.nix 2021-12-31 16:16:53 +01:00
b7646b0500 feat(ci): add github action 2021-12-31 16:14:05 +01:00
749582bc9b chore(ci): move to own file 2021-12-31 16:05:08 +01:00
e9ae2ddd59 fix(stardict): sd-classics works when we filter out georges LD 2021-12-31 16:04:48 +01:00
e6462e0c34 feat: add ci scripts to flake 2021-12-31 15:56:43 +01:00
127cb41e60 fix: schusseligkeit 2021-12-31 15:56:20 +01:00
a77cbcf919 feat(tmux): enable on zaatar and makanek 2021-12-31 13:21:48 +01:00
62fbad949a feat(packages): no handpicked haskell packages, stardict 2021-12-31 13:21:33 +01:00
087c9c0b94 fix: nix-index-update 2021-12-31 13:20:32 +01:00
74a437af22 fix: dont use chromium
it builds forever
2021-12-31 13:19:56 +01:00
e431a89ab2 chore: follow flake-utils 2021-12-30 16:59:58 +01:00
0d6c540143 chore: remove shell.nix 2021-12-30 16:55:14 +01:00
5b3aea782b feat: deploy makanek, kabsa 2021-12-30 16:42:02 +01:00
913f60a7f5 feat: manage dependencies with flakes 2021-12-30 16:22:15 +01:00
b877eaa1b7 feat: upgrade nix 2021-12-30 14:08:05 +01:00
ed788d318f feat(weechat): start from clean configs, autoconnect 2021-12-30 03:37:53 +01:00
2283dd67c6 feat: streamline krops experience 2021-12-30 03:01:26 +01:00
8b8e0078c1 fix: downgrade nix 2021-12-30 03:01:16 +01:00
f7763cb99b feat(weechat): use declarative 2021-12-30 03:01:05 +01:00
58d39aa41a chore: move configs to system directories 2021-12-29 18:56:19 +01:00
383fb35837 feat(weechat): automatically set nickserv options at retiolum 2021-12-29 17:55:58 +01:00
3cb561e6cc feat(weechat): add sasl to retiolum 2021-12-29 17:48:09 +01:00
2a98e680c2 feat(streams): add rc3 radio 2021-12-29 10:29:33 +01:00
d5087c40b2 feat: use flake nix 2021-12-28 23:24:30 +01:00
23fb65ce1e chore(retiolum): update 2021-12-28 20:49:43 +01:00
c49a5a4187 feat(retiolum): use ed25519 keys 2021-12-28 17:04:54 +01:00
42df2c032e derp 2021-12-28 17:04:54 +01:00
86d6943dd2 feat(kabsa): disable zramfs 2021-12-28 17:04:54 +01:00
6f10cd277d fix(weechat): matrix server 2021-12-28 15:39:56 +01:00
869c6e6a08 fix(vim): make a tiny bit faster 2021-12-28 14:48:29 +01:00
5b131a5a30 feat: flameshot -> flameshot-once 2021-12-28 14:48:09 +01:00
0423429e02 fix: send transits at correct time 2021-12-27 10:40:51 +01:00
f451cc5028 feat(astrolog): configure 2021-12-27 10:29:11 +01:00
8f9e8db71e fix(traadfri): dont timeout 2021-12-25 18:03:57 +01:00
81e6b5c9f6 feat: transits telegram bot 2021-12-25 08:31:11 +01:00
50d8788088 chore: update 2021-12-25 08:31:11 +01:00
805b46ffb1 feat: remove nur-packages 2021-12-25 08:31:10 +01:00
bc9217ba3e feat(weechat): improve zero covid 2021-12-22 23:08:58 +01:00
db2ec25bc1 feat: remove praesenzlehre-berlin.org 2021-12-22 23:06:54 +01:00
33b960143b feat: remove nur-packages 2021-12-22 22:55:43 +01:00
f02225d1e9 feat: use upstream astrolog 2021-12-22 10:19:16 +01:00
9c2e2df05a feat: astrolog 2021-12-21 18:17:37 +01:00
aaeef41f55 feat: anki# 2021-12-21 07:39:23 +01:00
0787da719e fix(retiolum-map): also update index.html 2021-12-20 15:10:19 +01:00
e225a7d451 feat(tinc-graph): update 2021-12-18 10:48:38 +01:00
9d3b29add2 chore: update 2021-12-17 19:02:32 +01:00
5792224240 Revert "feat(shell.nix): colourful parallel"
This reverts commit 5ade0a7011.
2021-12-17 19:02:22 +01:00
ecadc12c9f feat(zaatar): disable tuna 2021-12-16 08:46:02 +01:00
4ecc34b63e feat(tarot): update key file 2021-12-16 00:19:28 +01:00
48e2be7427 feat(tarot): serve files and waites key 2021-12-15 15:01:19 +01:00
296a3a9c9f feat(tarot): occasionally reverse 2021-12-15 15:00:46 +01:00
0136215a4a feat(tarot): run at tarot.kmein.de 2021-12-15 13:54:51 +01:00
dd8a885e81 feat: add transits script 2021-12-15 13:54:51 +01:00
e755ee06e2 feat(makanek): run tarot service on tarot.kmein.r 2021-12-15 12:38:09 +01:00
5ade0a7011 feat(shell.nix): colourful parallel 2021-12-15 12:38:09 +01:00
bed0795a04 fix(monitoring): probe alew.hu-berlin.de every 5 min 2021-12-14 19:20:11 +01:00
31d59aba6a feat(monitoring): probe alew.hu-berlin.de 2021-12-14 19:20:10 +01:00
08c04462a7 feat(monitoring): probe alew.hu-berlin.de 2021-12-13 17:29:09 +01:00
7d00a2e896 fix(pmount): setuid root 2021-12-13 11:58:00 +01:00
1027a850fb feat: add bvg disruptions script 2021-12-13 11:57:42 +01:00
314134d861 feat(hu-berlin): reenable forti vpn 2021-12-13 11:57:27 +01:00
143b2f1a06 Revert "feat(nextcloud): move to cloud.kmein.de"
This reverts commit 8a45abae35.
2021-12-11 09:45:25 +01:00
02cc600c68 feat: install pandoc users guide as man page 2021-12-10 20:25:07 +01:00
25c48354f7 feat: add csv2json and json2csv scripts 2021-12-10 19:43:06 +01:00
5b2c2c7709 feat(scripts): add auc roman calendar 2021-12-10 19:42:52 +01:00
e55cc77825 feat(readme): add attribution 2021-12-09 12:59:19 +01:00
8a45abae35 feat(nextcloud): move to cloud.kmein.de 2021-12-09 07:14:35 +01:00
e046c74539 chore(retiolum): update 2021-12-08 13:11:07 +01:00
9dae3e2d1a feat(weechat): add weechat-matrix 2021-12-08 12:15:14 +01:00
0fea7ba938 feat(moodle-dl): serve via retiolum 2021-12-08 11:39:19 +01:00
edcbe19fb2 feat: add rudimentary readme 2021-12-08 11:03:48 +01:00
ee573e13fc fix(kabsa, manakish): disable illum, hardware does it by itself 2021-12-07 20:09:22 +01:00
83d23f8b55 feat(zaatar): add gaslight 2021-12-07 20:00:10 +01:00
addd7077ed fix(khal): restore cloud address 2021-12-07 20:00:10 +01:00
ec175ef3d7 feat(khal): config format changed with 4.0.0 2021-12-07 20:00:10 +01:00
143 changed files with 3324 additions and 2363 deletions

46
.bin/bvg.sh Executable file
View File

@@ -0,0 +1,46 @@
#!/bin/sh
interesting="U6 N6 140 M46 184 N84"
curl -sSL 'https://www.bvg.de/disruption-reports/q' \
--data-raw '{"variables":{},"query":"{
allDisruptions {
disruptions {
meldungsId
linie
verkehrsmittel
__typename
... on Traffic {
datum
gueltigVonDatum
gueltigVonZeit
gueltigBisDatum
gueltigBisZeit
richtungName
richtungHafasId
beginnAbschnittName
beginnAbschnittHafasId
endeAbschnittName
endeAbschnittHafasId
textIntUrsache
sev
textIntAuswirkung
umfahrung
textWAPSMSUrsache
textWAPSMSAuswirkung
prioritaet
__typename
}
}
__typename
}
}"}' \
| jq --arg interesting "$interesting" '
.data.allDisruptions.disruptions
| map(select(
(.linie as $linie
| $interesting
| split(" ")
| index($linie))
and (.["__typename"] == "Traffic")
))
'

14
.bin/csv2json Executable file
View File

@@ -0,0 +1,14 @@
#!/usr/bin/env python3
import csv
import json
import sys
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--delimiter", "-d", default=",", help="CSV field separator")
args = parser.parse_args()
if __name__ == "__main__":
json.dump(list(csv.DictReader(sys.stdin, delimiter=args.delimiter)), sys.stdout)

7
.bin/elm-publish-private Executable file
View File

@@ -0,0 +1,7 @@
#! /usr/bin/env nix-shell
#! nix-shell -p "(import <nixpkgs> { overlays = [ (import ~/work/fysiweb/engiadina-pwa/devops/pkgs) ]; }).elm-publish-private"
#! nix-shell -i bash
set -efux
exec elm-publish-private "$@"

24
.bin/json2csv Executable file
View File

@@ -0,0 +1,24 @@
#!/usr/bin/env python3
import csv
import json
import sys
if __name__ == "__main__":
json_list = json.load(sys.stdin)
if not isinstance(json_list, list):
print("JSON object is not a list.", file=sys.stderr)
sys.exit(1)
if len(json_list) == 0:
print("JSON list is empty.", file=sys.stderr)
sys.exit(1)
keys = set()
for element in json_list:
if isinstance(element, dict):
keys |= element.keys()
else:
print("Non-dict element:", element, file=sys.stderr)
sys.exit(1)
writer = csv.DictWriter(sys.stdout, fieldnames=list(keys))
writer.writeheader()
for element in json_list:
writer.writerow(element)

1
.bin/mud.sh Executable file
View File

@@ -0,0 +1 @@
ssh mud@hotdog.r -t "MUD_NICKNAME=$LOGNAME mud"

49
.bin/space.py Normal file
View File

@@ -0,0 +1,49 @@
import ephem
from datetime import datetime, date, timedelta
now = datetime.now()
limit = now + timedelta(days=365)
def events_until(limit):
initial_date = ephem.Date(datetime.now())
events = {}
now = initial_date
while ephem.localtime(now) <= limit:
now = ephem.next_full_moon(now)
events[now] = "🌕"
now = initial_date
while ephem.localtime(now) <= limit:
now = ephem.next_new_moon(now)
events[now] = "🌑"
now = initial_date
while ephem.localtime(now) <= limit:
now = ephem.next_vernal_equinox(now)
events[now] = "spring equinox"
now = initial_date
while ephem.localtime(now) <= limit:
now = ephem.next_autumnal_equinox(now)
events[now] = "fall equinox"
now = initial_date
while ephem.localtime(now) <= limit:
now = ephem.next_winter_solstice(now)
events[now] = "winter solstice"
now = initial_date
while ephem.localtime(now) <= limit:
now = ephem.next_summer_solstice(now)
events[now] = "summer solstice"
return events
events = events_until(limit)
for date, event in sorted(events.items(), key=lambda x: x[0]):
if ephem.localtime(date) < limit:
print(ephem.localtime(date), event)

19
.github/workflows/flake.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: Update flake.lock
on:
workflow_dispatch: # allows manual triggering
schedule:
- cron: '0 0 * * 0' # runs weekly on Sunday at 00:00
jobs:
lockfile:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Install Nix
uses: cachix/install-nix-action@v16
with:
extra_nix_config: |
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
- name: Update flake.lock
uses: DeterminateSystems/update-flake-lock@v3

14
.github/workflows/niveum.yml vendored Normal file
View File

@@ -0,0 +1,14 @@
name: CI
on:
push:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
system: [makanek,manakish,kabsa,zaatar]
steps:
- uses: actions/checkout@v2
- uses: cachix/install-nix-action@v16
- run: nix run .#build-${{matrix.system}}

9
.gitmodules vendored
View File

@@ -1,9 +0,0 @@
[submodule "submodules/menstruation-telegram"]
path = submodules/menstruation-telegram
url = https://github.com/kmein/menstruation-telegram
[submodule "submodules/menstruation-backend"]
path = submodules/menstruation-backend
url = https://github.com/kmein/menstruation.rs
[submodule "submodules/nur-packages"]
path = submodules/nur-packages
url = git@github.com:kmein/nur-packages.git

View File

@@ -1,10 +0,0 @@
{
"url": "https://github.com/nix-community/home-manager.git",
"rev": "3e93c4e8b2b479c712b7c20a428993b459118842",
"date": "2021-11-30T11:10:06+01:00",
"path": "/nix/store/nsfhkc6gkg3wf0b87z15zd0izp8j52av-home-manager",
"sha256": "0wgx47fyypbzpm2sbxj8xs846wvdkw1f76a8g3lbkxpla075vrl5",
"fetchSubmodules": false,
"deepClone": false,
"leaveDotGit": false
}

View File

@@ -1,10 +0,0 @@
{
"url": "https://cgit.krebsco.de/krops",
"rev": "cccebf3ff7a53336b3f106cb96dddd5892d427ed",
"date": "2021-03-23T22:47:37+01:00",
"path": "/nix/store/mz13xxnil35lwsf90hwnrm2agir7hb51-krops",
"sha256": "07mg3iaqjf1w49vmwfchi7b1w55bh7rvsbgicp2m47gnj9alwdb6",
"fetchSubmodules": false,
"deepClone": false,
"leaveDotGit": false
}

View File

@@ -1,10 +0,0 @@
{
"url": "https://github.com/mozilla/nixpkgs-mozilla",
"rev": "cbc7435f5b0b3d17b16fb1d20cf7b616eec5e093",
"date": "2021-11-19T10:51:56-05:00",
"path": "/nix/store/bvbq377c43f6v7ndff80jdmf4m6wmn2c-nixpkgs-mozilla",
"sha256": "1kapba23cy3y1ghyqpm0rapbrfj3qdkd7v58c6g8bhpys9qq1aic",
"fetchSubmodules": false,
"deepClone": false,
"leaveDotGit": false
}

View File

@@ -1,10 +0,0 @@
{
"url": "https://github.com/NixOS/nixpkgs.git",
"rev": "5d056884fbf7e5c693e17a1dbaf426e49f739b6a",
"date": "2021-12-01T07:35:38+01:00",
"path": "/nix/store/iqhw5vmfqqrmnwbbz247pjycvchnvsv0-nixpkgs",
"sha256": "1kcllypk4xl9kkzqi5ylmq0hnrs200a8wyk3wlh3g4g3zma2ams8",
"fetchSubmodules": false,
"deepClone": false,
"leaveDotGit": false
}

View File

@@ -1,10 +0,0 @@
{
"url": "https://github.com/NixOS/nixpkgs.git",
"rev": "96b4157790fc96e70d6e6c115e3f34bba7be490f",
"date": "2021-11-30T21:39:06+08:00",
"path": "/nix/store/lcn20w73v7gcd121kr5kmmncrqkh5bw7-nixpkgs",
"sha256": "05m0gn1dy0cdlamwyiq276s770bm2pw8qx6s0mfrv3khpcvv186l",
"fetchSubmodules": false,
"deepClone": false,
"leaveDotGit": false
}

View File

@@ -1,10 +0,0 @@
{
"url": "https://github.com/krebs/retiolum",
"rev": "aa6ff5e73bc6127676b79d5d9166279a135d667c",
"date": "2021-11-30T23:32:16+01:00",
"path": "/nix/store/7p7aa7ik2jc5csgvalw397lhpzvzgjg4-retiolum",
"sha256": "0rn113kxx1nk9zcjx0rfjjy002zvqrnk0lki6wlnlimqx8wjdb59",
"fetchSubmodules": false,
"deepClone": false,
"leaveDotGit": false
}

View File

@@ -1,11 +0,0 @@
{
"url": "https://cgit.lassul.us/stockholm",
"rev": "b79f5ab97db8115c4b2e66e57bb84587a31ce1e0",
"date": "2021-11-30T23:09:27+01:00",
"path": "/nix/store/ng83hpfszfnm3d80i5kv50qgqqsqgkrj-stockholm",
"sha256": "0g70jzya62nw3w6vwjdddn2i9hlm8r1d1f1wnl2bzibwx6p97bp6",
"fetchLFS": false,
"fetchSubmodules": false,
"deepClone": false,
"leaveDotGit": false
}

10
README.md Normal file
View File

@@ -0,0 +1,10 @@
# niveum
> [nĭvĕus](https://logeion.uchicago.edu/niveus), a, um, adj. [nix], _of_ or _from snow, snowy, snow-_ (poet.)
>
> 1. Lit.: aggeribus niveis informis, Verg. G. 3, 354: aqua, _cooled with snow_, Mart. 12, 17, 6; cf. id. 14, 104 and 117: mons, _covered with snow_, Cat. 64, 240.—
>
> 2. Transf., _snow-white, snowy_ (mostly poet.): a similitudine sic: Corpore niveum candorem, aspectu igneum ardorem assequebatur, Auct. Her. 4, 33, 44: lacerti, Verg. A. 8, 387: lac, id. E. 2, 20: hanc si capite niveae agnae exorari judicas, Sen. Q. N. 2, 36: Briseis niveo colore, Hor. C. 2, 4, 3: vestis, Ov. M. 10, 432: candidior nivei folio, Galatea, ligustri, id. ib. 13, 789: dens, id. H. 18, 18: quā notam duxit niveus videri, Hor. C. 4, 2, 59: panis, Juv. 5, 70: flumen, _clear, pellucid_, Sen. Hippol. 504: undae, Mart. 7, 32, 11: tribuni, _clothed in white togas_, Calp. Ecl. 7, 29; so, Quirites, Juv. 10, 45.
## Pressestimmen
> das ist ja pure poesie —[xkey](https://github.com/riotbib)

67
ci.nix Normal file
View File

@@ -0,0 +1,67 @@
{ inputs, system, name }:
let
inherit (inputs) nixpkgs;
pkgs = nixpkgs.legacyPackages.${system};
ensureFiles = paths: pkgs.runCommand "directory" {} ''
set -efu
mkdir $out
cd $out
${nixpkgs.lib.concatMapStringsSep "\n" (path: ''
mkdir -p "$(dirname ${nixpkgs.lib.escapeShellArg path})"
echo foo > ${nixpkgs.lib.escapeShellArg path}
'') paths}
'';
nixPath = nixpkgs.lib.concatStringsSep ":" ([
"niveum=${toString ./.}"
"nixos-config=${toString ./.}/systems/${name}/configuration.nix"
"system-secrets=${systemSecrets}"
"secrets=${sharedSecrets}"
] ++ nixpkgs.lib.mapAttrsToList (name: value: "${name}=${value}") inputs);
# cd ~/.password-store/shared && find * -type f | sed 's/.gpg$//'
sharedSecrets = ensureFiles [
"di.fm/key"
"eduroam/identity"
"eduroam/password"
"mail/cock"
"mail/fastmail"
"mail/gmail/amroplay"
"mail/gmail/kieran.meinhardt"
"mail/meinhaki"
"mail/posteo"
"nextcloud-fysi/password"
"nextcloud/password"
"openweathermap.key"
"restic/password"
"traadfri.key"
"wifi/Aether.psk"
"spotify/username"
"spotify/password"
];
systemSecrets = let basic = [ "retiolum.ed25519" "retiolum.key" "syncthing/cert.pem" "syncthing/key.pem"]; in {
zaatar = ensureFiles ([ "moodle.token" "telegram/moodle-dl.token" "mpd-web.key" ] ++ basic);
kabsa = ensureFiles basic;
manakish = ensureFiles basic;
makanek = ensureFiles ([
"irc/retiolum"
"irc/hackint"
"irc/libera"
"irc/oftc"
"matrix/nibbana"
"maxmind/license.key"
"moodle-dl/faye.token"
"nextcloud/admin"
"nextcloud/database"
"telegram/nachtischsatan.token"
"telegram/reverse.token"
"telegram/odyssey.token"
"telegram/betacode.token"
"telegram/moodle-dl.token"
"telegram/proverb.token"
"telegram/menstruation.token"
"telegram/cool_village.token"
"telegram/kmein.token"
"telegram/prometheus.token"
"weechat/relay"
] ++ basic);
}.${name};
in toString (pkgs.writers.writeDash "build" "NIX_PATH=${nixPath} nix-build '<nixpkgs/nixos>' -A system --dry-run")

44
configs/backup.nix Normal file
View File

@@ -0,0 +1,44 @@
{ pkgs, config, ... }:
let
inherit (import <niveum/lib>) restic;
in
{
services.restic.backups.niveum = {
initialize = true;
inherit (restic) repository;
timerConfig = { OnCalendar = "8:00"; RandomizedDelaySec = "1h"; };
passwordFile = toString <secrets/restic/password>;
extraBackupArgs = [
"--exclude=/home/kfm/projects/nixpkgs/.git"
"--exclude=node_modules"
];
paths = [
"/home/kfm/work"
"/home/kfm/projects"
"/home/kfm/cloud"
"/home/kfm/.gnupg"
"/home/kfm/.ssh"
];
};
systemd.services.restic-backups-niveum.serviceConfig = {
Restart = "on-failure";
RestartSec = "15s";
StartLimitIntervalSec = "1m"; # don't try more than 4 times
StartLimitBurst = 4;
};
environment.systemPackages = [
(pkgs.writers.writeDashBin "restic-niveum" ''
${pkgs.restic}/bin/restic -r ${restic.repository} -p ${<secrets/restic/password>} "$@"
'')
(pkgs.writers.writeDashBin "restic-mount" ''
mountdir=$(mktemp -d)
trap clean EXIT
clean() {
rm -r "$mountdir"
}
${pkgs.restic}/bin/restic -r ${restic.repository} -p ${<secrets/restic/password>} mount "$mountdir"
'')
];
}

View File

@@ -1,57 +0,0 @@
{ pkgs, lib, ... }:
let
inherit (import <niveum/lib>) serveHtml;
stations = [
900068204 # A/M
900068302 # KAS
900068203 # B-P
];
fahrplan = pkgs.writeText "fahrplan.html" ''
<!DOCTYPE html>
<title>Fahrplan</title>
<link
rel="icon"
type="image/x-icon"
href="https://mobil.bvg.de/Fahrinfo/img/ua_xhtml/logo.gif"
/>
<style>
body {
margin: 0;
--bvg-yellow: #f0d722;
}
#fahrplan {
display: flex;
height: 100vh;
width: 100%;
flex-direction: row;
}
#fahrplan iframe {
flex-grow: 1;
border: none;
}
#fahrplan iframe + iframe {
border-left: 2px solid var(--bvg-yellow);
}
</style>
<body>
<div id="fahrplan">
${lib.concatMapStrings (station: ''
<iframe scrolling="no" src="https://mobil.bvg.de/Fahrinfo/bin/stboard.bin/dox?ld=0.1&input=${toString station}&boardType=depRT&start=yes"></iframe>
'') stations}
</div>
</body>
'';
in
{
services.nginx = {
enable = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
};
services.nginx.virtualHosts."bvg.kmein.r" = {
locations."/".extraConfig = serveHtml fahrplan pkgs;
};
}

View File

@@ -10,7 +10,7 @@
];
};
environment.systemPackages = [ pkgs.chromium pkgs.brave ];
environment.systemPackages = [ pkgs.brave ];
environment.variables.BROWSER = "brave";
}

View File

@@ -14,7 +14,10 @@
'';
home-manager.users.me = {
services.nextcloud-client.enable = true;
services.nextcloud-client = {
enable = true;
startInBackground = true;
};
};
environment.systemPackages = [

View File

@@ -20,15 +20,14 @@ in {
config = {
allowUnfree = true;
packageOverrides = pkgs: {
writeDashBin = pkgs.writers.writeDashBin;
writeDash = pkgs.writers.writeDash;
dmenu = pkgs.writers.writeDashBin "dmenu" ''exec ${pkgs.rofi}/bin/rofi -dmenu "$@"'';
gfs-fonts = pkgs.callPackage <niveum/packages/gfs-fonts.nix> {};
tocharian-font = pkgs.callPackage <niveum/packages/tocharian-font.nix> {};
iolanguage = pkgs.callPackage <niveum/packages/iolanguage.nix> { };
ix = pkgs.callPackage <niveum/packages/ix.nix> { };
};
};
overlays = [
(import <stockholm/krebs/5pkgs>)
(self: super: {
scripts = import <niveum/packages/scripts> { pkgs = super; lib = super.lib; };
})
@@ -138,8 +137,7 @@ in {
"${pkgs.youtube-dl}/bin/youtube-dl --add-metadata -xic"; # Download with audio
};
}
{ i18n.defaultLocale = "en_GB.UTF-8"; }
{ services.illum.enable = true; }
{ i18n.defaultLocale = "en_DK.UTF-8"; }
{
services.xserver = {
enable = true;
@@ -161,12 +159,12 @@ in {
{
security.wrappers = {
pmount = {
owner = config.users.users.me.name;
owner = "root";
group = "users";
source = "${pkgs.pmount}/bin/pmount";
};
pumount = {
owner = config.users.users.me.name;
owner = "root";
group = "users";
source = "${pkgs.pmount}/bin/pumount";
};
@@ -197,13 +195,12 @@ in {
}) localAddresses;
}
./alacritty.nix
./backup.nix
./bash.nix
./beets.nix
./bluetooth.nix
./ccc.nix
# ./kleiter.nix
./khal.nix
./engiadina.nix
./chromium.nix
./cloud.nix
./copyq.nix
@@ -215,7 +212,6 @@ in {
./flix.nix
./fonts.nix
./fzf.nix
./gaslight.nix
./git.nix
./hledger.nix
./htop.nix
@@ -225,13 +221,14 @@ in {
./lb.nix
./mpv.nix
./mime.nix
./nano.nix
./neovim.nix
./neomutt.nix
./nix.nix
./newsboat.nix
./flameshot-once.nix
./packages
./packages.nix
./stardict.nix
./polkit.nix
./power-action.nix
./printing.nix
./openweathermap.nix
@@ -247,10 +244,8 @@ in {
./sxiv.nix
./theming.nix
./tmux.nix
# ./tor.nix
./traadfri.nix
./unclutter.nix
./version.nix
./vscode.nix
./watson.nix
./zsh.nix

View File

@@ -1,30 +0,0 @@
{ config, pkgs, ... }:
let
inherit (import <niveum/lib>) tmpfilesConfig;
cdnRoot = "/var/lib/engiadina";
in
{
imports = [ <stockholm/krebs/3modules/permown.nix> ];
krebs.permown.${cdnRoot} = {
owner = config.users.users.me.name;
group = "users";
umask = "0002";
};
services.nginx = {
enable = true;
virtualHosts.default = {
root = cdnRoot;
listen = [{
addr = "0.0.0.0";
port = 3333;
}];
};
};
environment.shellAliases = {
engiadina-watch = "${pkgs.findutils}/bin/find extra-src src | ${pkgs.entr}/bin/entr -s 'build-component && ${pkgs.rsync}/bin/rsync -avu dist/*.js ${cdnRoot}/'";
engiadina-edit = "$EDITOR ${cdnRoot}/index.html";
};
}

View File

@@ -1,26 +1,42 @@
{ config, lib, pkgs, ... }:
{
home-manager.users.me = {
services.flameshot.enable = true;
xdg.configFile."flameshot/flameshot.ini".source = (pkgs.formats.ini {}).generate "flameshot.ini" {
General = {
disabledTrayIcon = true;
checkForUpdates = false;
contrastOpacity = 188;
savePath = "/tmp";
savePathFixed = true;
drawThickness = 0;
showStartupLaunchMessage = false;
filenamePattern = "shot_%F_%T";
{ lib, pkgs, ... }:
let
inherit (import <niveum/lib>) defaultApplications;
flameshot-once =
pkgs.callPackage <stockholm/krebs/5pkgs/simple/flameshot-once> {};
in {
environment.systemPackages = [
(flameshot-once.override {
config = {
imgur = {
enable = true;
createUrl = "http://p.r/image";
deleteUrl = "http://p.r/image/delete/%1";
xdg-open.browser = (defaultApplications pkgs).browser;
};
timeout = 1000;
drawColor = "#ff0000";
drawThickness = 2;
showDesktopNotification = true;
buttons = [
"ARROW"
"BLUR"
"CIRCLE"
"CIRCLECOUNT"
"COPY"
"DRAWER"
"EXIT"
"IMAGEUPLOADER"
"MARKER"
"MOVESELECTION"
"PENCIL"
"RECTANGLE"
"SAVE"
"SELECTION"
"SELECTIONINDICATOR"
"TEXT"
"UNDO"
];
};
};
systemd.user.services.flameshot.Unit.Requires = lib.mkForce [];
systemd.user.services.flameshot.Environment = {
# IMGUR_CREATE_URL = "https://p.krebsco.de/image";
# IMGUR_DELETE_URL = "https://p.krebsco.de/image/delete/%1";
PATH = "${config.home-manager.users.me.home.profileDirectory}/bin";
};
};
})
];
}

View File

@@ -18,7 +18,6 @@ in {
"x-systemd.device-timeout=1"
"x-systemd.idle-timeout=1min"
"x-systemd.requires=tinc.retiolum.service"
"x-systemd.requires=wpa_supplicant.service"
"user"
"_netdev"
];

View File

@@ -30,6 +30,7 @@
jetbrains-mono
twemoji-color-font
joypixels
tocharian-font
];
fontconfig.defaultFonts = {
monospace = [ "JetBrains Mono" "JoyPixels" ];

View File

@@ -7,7 +7,6 @@ in
pkgs.mr
pkgs.git
pkgs.gitAndTools.gitflow
pkgs.gitAndTools.hub
pkgs.gitAndTools.gh
pkgs.gitAndTools.git-extras
pkgs.gitAndTools.git-trim
@@ -23,37 +22,6 @@ in
};
home-manager.users.me = {
home.file.".mrconfig".text = let
prependPath = prefix:
lib.attrsets.mapAttrs'
(path: lib.attrsets.nameValuePair "${prefix}/${path}");
git = url: { checkout = "git clone ${url}"; };
github = owner: repo: git "git@github.com:${owner}/${repo}";
keybase = owner: repo: git "keybase://private/${owner}/${repo}";
in lib.generators.toINI { } ({
DEFAULT = { git_gc = ''git gc "$@"''; };
} // prependPath "projects" {
"menstruation.rs" = github "kmein" "menstruation.rs";
brockman = github "kmein" "brockman";
challenges = github "kmein" "challenges";
conlangs = github "kmein" "conlangs";
ledger = keybase "kmein" "ledger";
mahlzeit = github "kmein" "mahlzeit";
menstruation-telegram = github "kmein" "menstruation-telegram";
meteora = github "kmein" "meteora";
modernizr = github "kmein" "modernizr";
niveum = github "kmein" "niveum";
nixpkgs = github "NixOS" "nixpkgs";
poetry = github "kmein" "poetry";
quotes = github "kmein" "quotes";
sphinx = github "kmein" "sphinx";
stockholm = git "https://cgit.krebsco.de/stockholm";
telebots = github "kmein" "telebots";
traadfri = github "kmein" "traadfri";
wissen = github "kmein" "wissen";
zen = github "kmein" "zen";
});
programs.git = {
enable = true;
package = pkgs.gitAndTools.gitFull;
@@ -78,25 +46,13 @@ in
pull.ff = "only";
rebase.autoStash = true;
merge.autoStash = true;
core.pager =
"${pkgs.gitAndTools.diff-so-fancy}/bin/diff-so-fancy | ${pkgs.less}/bin/less --tabs=4 -RFX";
color = {
ui = true;
diff = {
meta = "11";
frag = "magenta bold";
commit = "yellow bold";
old = "red bold";
new = "green bold";
whitespace = "red reverse";
};
diff-highlight = {
oldNormal = "red bold";
oldHighlight = "red bold 52";
newNormal = "green bold";
newHighlight = "green bold 22";
};
};
# ref https://github.com/dandavison/delta
core.pager = "${pkgs.delta}/bin/delta";
interactive.diffFilter = "${pkgs.delta}/bin/delta --color-only";
delta.navigate = true;
merge.conflictStyle = "diff3";
diff.colorMoved = "default";
};
};
};

View File

@@ -1,61 +0,0 @@
{ config, pkgs, lib, ... }:
let
inherit (import ./lib.nix) triggers;
inherit (import <niveum/lib>) localAddresses;
in
{
imports = [
./zigbee.nix
./frontend.nix
];
services.home-assistant = {
enable = true;
configWritable = true;
lovelaceConfigWritable = true;
openFirewall = true;
config = {
homeassistant = {
name = "Toum";
latitude = config.location.latitude;
longitude = config.location.longitude;
elevation = 90; # TODO find out how high I live
unit_system = "metric";
time_zone = config.time.timeZone;
};
config = {};
discovery = {};
system_health = {};
history = {};
# tradfri.host = localAddresses.tradfri; # dont use until python3Packages.pytradfri is packaged
sun = {};
mobile_app = {};
shopping_list = {};
sensor = [
{
platform = "dwd_weather_warnings";
region_name = "Berlin";
}
];
mqtt = {
broker = "localhost";
port = 1883;
client_id = "home-assistant";
username = "albrecht";
password = lib.strings.fileContents <system-secrets/mosquitto>;
keepalive = 60;
protocol = "3.1";
discovery = true;
birth_message = {
topic = "/hass/status";
payload = "online";
};
will_message = {
topic = "/hass/status";
payload = "offline";
};
};
};
};
}

View File

@@ -1,37 +0,0 @@
let
inherit (import ./lib.nix) triggers;
in
{
services.home-assistant.config = {
frontend = {
themes = {
day_theme = import ./themes/clear.nix;
night_theme = import ./themes/clear-dark.nix;
};
};
automation = [
{
alias = "Night Theme";
hide_entity = true;
trigger = triggers.night;
action = [
{
service = "frontend.set_theme";
data.name = "night_theme";
}
];
}
{
alias = "Day Theme";
hide_entity = true;
trigger = triggers.day;
action = [
{
service = "frontend.set_theme";
data.name = "day_theme";
}
];
}
];
};
}

View File

@@ -1,16 +0,0 @@
{
triggers = {
night = {
platform = "numeric_state";
entity_id = "sun.sun";
value_template = "{{ state.attributes.elevation }}";
below = -4.0;
};
day = {
platform = "numeric_state";
entity_id = "sun.sun";
value_template = "{{ state.attributes.elevation }}";
above = 0;
};
};
}

View File

@@ -1,72 +0,0 @@
rec {
# Colors
text-color = "#DADADB"; # Grey text
text-medium-light-color = "#A0A2A8"; # Medium-light grey text
text-medium-color = "#80828A"; # Medium grey text
text-dark-color = "#6A6B74"; # Dark grey text
accent-color = "#008bef"; # Blue
accent-medium-color = "#2484C9"; # Decent blue
background-color = "#3b4049"; # Dark grey background
background-color-2 = "#484E59"; # Light grey background
background-card-color = "#434952"; # Grey background
border-color = "#383C46"; # Grey border
# Header
app-header-background-color = "#363941"; # Background color
# Text
primary-color = text-color;
text-primary-color = text-color;
# Left Menu
paper-listbox-background-color = background-color; # Background
sidebar-icon-color = text-medium-color; # icons
sidebar-selected-icon-color = text-medium-light-color; # Selected row icon and background (15%)
sidebar-selected-text-color = text-color; # Selected row label
# UI
paper-card-header-color = text-color; # Title in settings
primary-background-color = background-color; # Background (also title background in left menu)
mdc-theme-primary = accent-medium-color; # Action Buttons (save, restart etc.)
card-background-color = background-card-color; # Entity Registry Background
# Card
paper-card-background-color = background-card-color; # Background
dark-primary-color = text-color;
primary-text-color = text-color;
paper-listbox-color = text-color;
light-primary-color = text-dark-color;
secondary-text-color = text-medium-color;
disabled-text-color = text-dark-color;
paper-dialog-button-color = text-color;
secondary-background-color = background-color-2; # Background more info title
# Icons
paper-item-icon-color = text-dark-color; # Off
paper-item-icon-active-color = accent-color; # On
# Switches
switch-checked-button-color = text-medium-light-color; # Knob On
switch-unchecked-button-color = text-medium-light-color; # Knob Off
switch-checked-track-color = "#009FFF"; # Background On
switch-unchecked-track-color = "#767682"; # Background Off
# Slider
paper-slider-active-color = accent-color; # Line On
paper-slider-knob-color = text-medium-light-color; # Knob On
paper-slider-container-color = text-dark-color; # Line Off
paper-slider-knob-start-color = text-medium-light-color; # Knob Off
# Badges
label-badge-text-color = text-color;
label-badge-background-color = "rgba(54, 57, 65, 0.6)";
# Shadows
ha-card-box-shadow = "inset 0px 0px 0px 1px var(--border-color)";
# HACS
hacs-badge-color = accent-color; # New Badge
hacs-status-installed = text-color; # Installed Icon
hacs-status-pending-restart = text-dark-color; # Restart Icon
hacs-status-pending-update = accent-color;
}

View File

@@ -1,52 +0,0 @@
rec {
text-color = "#636B75"; # Grey text
text-medium-color = "#8c96a5"; # Medium grey text
text-light-color = "#BAC0C6"; # Light grey text
accent-color = "#00a1ff"; # Blue
background-color = "#F7F8F9"; # Light grey background
background-color-2 = "#F4F5F6"; # Light grey background
background-card-color = "rgba(255,255,255,1.0)"; # White background
border-color = "#E8E8E8"; # Light grey border
# Header
primary-color = text-color; # Background
text-primary-color = "#FFF"; # Text
# Left Menu
paper-listbox-background-color = background-color; # Background
# TODO = Text and Icons
# UI
paper-card-header-color = text-color; # Title in settings
primary-background-color = background-color; # Background color (also title background in left menu)
# Card
paper-card-background-color = background-card-color; # Background
dark-primary-color = text-color;
primary-text-color = text-color;
paper-listbox-color = text-color;
light-primary-color = text-light-color;
secondary-text-color = text-medium-color;
disabled-text-color = text-light-color;
paper-dialog-button-color = text-color;
secondary-background-color = background-color-2; # Background more info title
# Icons
paper-item-icon-color = text-light-color; # Off
paper-item-icon-active-color = accent-color; # On
# Switches
switch-checked-button-color = "#FFF"; # Knob On
switch-unchecked-button-color = "#FFF"; # Knob Off
switch-checked-track-color = "#0077FF"; # Background On
switch-unchecked-track-color = disabled-text-color; # Background Off
# Slider
paper-slider-active-color = accent-color; # Line On
paper-slider-container-color = "#e5e7ea"; # Line Off
paper-slider-knob-color = text-light-color; # Knob On
paper-slider-knob-start-color = text-light-color; # Knob Off
# Shadows
ha-card-box-shadow = "inset 0px 0px 0px 1px var(--border-color)";
}

View File

@@ -1,102 +0,0 @@
{ config, pkgs, lib, ... }:
let
inherit (import <niveum/lib>) localAddresses;
in
{
services.zigbee2mqtt = {
enable = true;
config = {
permit_join = false;
homeassistant = true;
serial = {
port = "/dev/ttyACM0";
disable_led = true;
};
mqtt = {
discovery = true;
base_topic = "zigbee";
server = "mqtt://${localAddresses.toum}";
user = "albrecht";
password = lib.strings.fileContents <system-secrets/mosquitto>;
};
};
};
services.mosquitto = {
enable = true;
host = "0.0.0.0";
allowAnonymous = false;
checkPasswords = true;
users."albrecht" = {
password = lib.strings.fileContents <system-secrets/mosquitto>;
acl = [ "topic readwrite #" ];
};
};
networking.firewall.allowedTCPPorts = [ 1883 ];
environment.systemPackages = [ pkgs.mosquitto ];
services.home-assistant = {
config = {
switch = [
{
platform = "mqtt";
name = "zigbee2mqtt_join";
state_topic = "/zigbee2mqtt/bridge/config/permit_join";
command_topic = "/zigbee2mqtt/bridge/config/permit_join";
payload_on = "true";
payload_off = "false";
}
];
timer.zigbee_permit_join = {
name = "Zigbee Time remaining";
duration = 120;
};
automation = [
# Automation to start timer when enable join is turned on
{
id = "zigbee_join_enabled";
alias = "";
hide_entity = "true";
trigger = {
platform = "state";
entity_id = "switch.zigbee2mqtt_join";
to = "on";
};
action = {
service = "timer.start";
entity_id = "timer.zigbee_permit_join";
};
}
# Automation to stop timer when switch turned off and turn off switch when timer finished
{
id = "zigbee_join_disabled";
hide_entity = "true";
trigger = [
{
platform = "event";
event_type = "timer.finished";
event_data.entity_id = "timer.zigbee_permit_join";
}
{
platform = "state";
entity_id = "switch.zigbee2mqtt_join";
to = "off";
}
];
action = [
{
service = "timer.cancel";
data.entity_id = "timer.zigbee_permit_join";
}
{
service = "switch.turn_off";
entity_id = "switch.zigbee2mqtt_join";
}
];
}
];
};
};
}

View File

@@ -14,7 +14,7 @@ let
"username=meinhaki"
"password=${lib.strings.fileContents <secrets/mail/meinhaki>}"
"noauto"
"x-systemd.requires=openvpn-hu-berlin.service"
"x-systemd.requires=hu-vpn.service"
"x-systemd.automount"
"x-systemd.device-timeout=1"
"x-systemd.idle-timeout=1min"
@@ -59,7 +59,7 @@ in {
];
systemd.services.hu-vpn = {
enable = false;
enable = true;
wants = [ "network-online.target" ];
conflicts = [ "openvpn-hu-berlin.service" ];
script = ''
@@ -67,7 +67,7 @@ in {
host = forti-ssl.vpn.hu-berlin.de
port = 443
trusted-cert = 42193a913d276d9eb86217612956e1e6464d6f07bed5393a4787c87adc4bd359
username = ${eduroam.identity}
username = ${eduroam.identity}@split_tunnel
password = ${eduroam.password}
''}
'';

View File

@@ -33,6 +33,9 @@ let
"curl" = pkgs.writers.writeDash "curl" ''
${pkgs.curl}/bin/curl -fSs "$(${pkgs.coreutils}/bin/cat)"
'';
ocr = pkgs.writers.writeDash "ocr" ''
${pkgs.tesseract4}/bin/tesseract -l eng+deu - stdout
'';
};
};
@@ -202,14 +205,12 @@ in {
"${modifier}+0" = "exec ${pkgs.scripts.menu-calc}/bin/=";
"${modifier}+Shift+w" = "exec ${pkgs.scripts.k-lock}/bin/k-lock";
"${modifier}+a" =
"exec --no-startup-id ${pkgs.rofi}/bin/rofi -display-window -show window";
"${modifier}+d" = "exec --no-startup-id ${pkgs.dmenu}/bin/dmenu_run";
"${modifier}+d" = "exec ${pkgs.writers.writeDash "run" ''exec ${pkgs.rofi}/bin/rofi -modi run,window,ssh,filebrowser -show run''}";
"${modifier}+Shift+d" = "exec ${
pkgs.writers.writeDash "notemenu" ''
set -efu
PATH=$PATH:${
lib.makeBinPath [ pkgs.dmenu pkgs.findutils pkgs.coreutils ]
lib.makeBinPath [ pkgs.rofi pkgs.findutils pkgs.coreutils ]
}
cd ~/notes
@@ -217,7 +218,7 @@ in {
echo diary/$(date -I).md
echo diary/$(date -I -d yesterday).md
find . -type f -printf "%T@ %p\n" | sort --reverse --numeric-sort | cut --delimiter=" " --fields=2
} | dmenu -i)
} | rofi -dmenu -i -p 'notes')
if test "$note_file"
then
i3-sensible-terminal -e "$EDITOR" "$note_file"
@@ -233,8 +234,7 @@ in {
"${modifier}+F10" = "exec ${pkgs.redshift}/bin/redshift -x";
"${modifier}+F11" = "exec ${pkgs.xcalib}/bin/xcalib -invert -alter";
"${modifier}+F12" = "exec ${klem}/bin/klem";
"Print" = "exec flameshot gui -p /tmp";
"Print" = "exec flameshot-once";
"XF86AudioLowerVolume" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -d 5";
"XF86AudioMute" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -t";
"XF86AudioRaiseVolume" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -i 5";

View File

@@ -2,8 +2,8 @@
let commaSep = builtins.concatStringsSep ",";
in {
services.xserver = {
layout = commaSep [ "de" "gr" "ru" ];
xkbVariant = commaSep [ "T3" "polytonic" "phonetic" ];
layout = commaSep [ "de" "gr" ];
xkbVariant = commaSep [ "T3" "polytonic" ];
xkbOptions =
commaSep [ "compose:caps" "terminate:ctrl_alt_bksp" "grp:ctrls_toggle" ];
libinput.enable = true;

View File

@@ -2,7 +2,7 @@
let
davHome = "~/.local/share/dav";
kmeinCloud = {
davEndpoint = "https://cloud.kmein.de/remote.php/dav";
davEndpoint = "https://cloud.xn--kiern-0qa.de/remote.php/dav";
username = "kieran";
password = lib.fileContents <secrets/nextcloud/password>;
};
@@ -59,13 +59,12 @@ in
skip_unparsable = no
'';
"todoman/todoman.conf".text = ''
[main]
path = ${davHome}/calendar/*
date_format = %Y-%m-%d
time_format = %H:%M
"todoman/config.py".text = ''
path = "${davHome}/calendar/*"
date_format = "%Y-%m-%d"
time_format = "%H:%M"
default_due = 0
default_list = Personal
default_list = "Personal"
startable = True
'';

View File

@@ -1,7 +1,4 @@
{ lib, pkgs, ... }:
let
nixpkgs-unstable = import <nixpkgs-unstable> {};
in
{
systemd.services.lb-subscription = {
enable = true;
@@ -15,10 +12,10 @@ in
first_year=2019
for year in $(${pkgs.coreutils}/bin/seq "$first_year" "$(date +%Y)"); do
${pkgs.curl}/bin/curl -sSL "https://www.literarische-blaetter.de/jahrgang-$year/" \
| ${nixpkgs-unstable.htmlq}/bin/htmlq --attribute href 'ul.slides a' \
| ${pkgs.htmlq}/bin/htmlq --attribute href 'ul.slides a' \
| while read -r month; do
${pkgs.curl}/bin/curl -sSL "$month" \
| ${nixpkgs-unstable.htmlq}/bin/htmlq --attribute src iframe \
| ${pkgs.htmlq}/bin/htmlq --attribute src iframe \
| ${pkgs.gnused}/bin/sed 's/.*?pdf=//;s/?wp-hosted.*//'
done
done | ${pkgs.findutils}/bin/xargs ${pkgs.wget}/bin/wget --no-clobber

View File

@@ -1,41 +0,0 @@
{ pkgs, lib, ... }:
let
backend = pkgs.callPackage <niveum/submodules/menstruation-backend> {};
telegram = pkgs.callPackage <niveum/submodules/menstruation-telegram> {};
backendPort = 8000;
in
{
containers.menstruation.autoStart = true;
containers.menstruation.config = { config, pkgs, ... }: {
services.redis.enable = true;
systemd.services.menstruation-telegram = {
wants = [
"network-online.target"
"menstruation-backend.service"
"redis.service"
];
wantedBy = [ "multi-user.target" ];
environment = {
MENSTRUATION_TOKEN = lib.strings.fileContents <system-secrets/telegram/menstruation.token>;
MENSTRUATION_ENDPOINT = "http://localhost:${toString backendPort}";
MENSTRUATION_MODERATORS = "18980945";
};
serviceConfig = {
Restart = "always";
DynamicUser = true;
ExecStart = "${telegram}/bin/menstruation-telegram";
};
};
systemd.services.menstruation-backend = {
wants = [ "network-online.target" ];
environment.ROCKET_PORT = toString backendPort;
serviceConfig = {
Restart = "always";
DynamicUser = true;
ExecStart = "${backend}/bin/menstruation_server";
};
};
};
}

View File

@@ -1,31 +0,0 @@
{ config, pkgs, lib, ... }:
let
moodle-dl-package = pkgs.moodle-dl.overrideAttrs (old: old // {
patches = [ <niveum/packages/moodle-dl/telegram-format.patch> ];
});
in
{
containers.moodle-dl-borsfaye = {
autoStart = true;
config = { lib, pkgs, ...}: {
imports = [ <niveum/modules/moodle-dl.nix> ];
services.moodle-dl = {
enable = true;
startAt = "hourly";
package = moodle-dl-package;
notifyOnly = true;
settings = {
telegram = {
token = lib.strings.fileContents <system-secrets/telegram/moodle-dl.token>;
chat_id = "311425510";
send_error_msg = false;
};
token = lib.strings.fileContents <system-secrets/moodle-dl/faye.token>;
moodle_domain = "moodle.hu-berlin.de";
moodle_path = "/";
};
};
};
};
}

View File

@@ -1,6 +1,5 @@
{ pkgs, lib, ... }: let
swallow = command: "${pkgs.scripts.swallow}/bin/swallow ${command}";
nixpkgs-unstable = import <nixpkgs-unstable> { config.allowUnfree = true; };
in {
environment.shellAliases.smpv = swallow "mpv";
@@ -22,7 +21,7 @@ in {
"Alt+j" = "add video-pan-y -0.05";
};
scripts = [
nixpkgs-unstable.mpvScripts.youtube-quality
pkgs.mpvScripts.youtube-quality
];
};
};

View File

@@ -1,10 +0,0 @@
{
programs.nano.nanorc = ''
set autoindent
set boldtext
set morespace
set smarthome
set tabsize 4
set tabstospaces
'';
}

View File

@@ -25,18 +25,13 @@
customRC = builtins.readFile <niveum/lib/vim/init.vim>;
packages.nvim = with pkgs.vimPlugins; {
start = [
# cheat-sh-vim
# deoplete-nvim
# vim-abolish
ale
fzf-vim
fzfWrapper
goyo
supertab
undotree
tabular
vimwiki
vim-256noir
# vimwiki
vim-colors-paramount
vim-commentary
vim-css-color
@@ -44,34 +39,26 @@
vim-fetch
vim-fugitive
vim-gitgutter
vim-pandoc
vim-pandoc-syntax # vim-pandoc-after
vim-repeat
vim-sensible
# vim-startify
vim-surround
vim-mail
];
opt = [
csv
dhall-vim
elm-vim
emmet-vim
haskell-vim
icalendar-vim
idris-vim
nim-vim
jq-vim
purescript-vim
rust-vim
typescript-vim
vim-fsharp
vim-javascript
vim-ledger
vim-nix
vim-reason-plus
vim-toml
vimtex
vim-pandoc
vim-pandoc-syntax
vim-256noir
];
};
};

View File

@@ -1,6 +1,5 @@
{ lib, pkgs, ... }:
let
autowifi = pkgs.writers.writePython3Bin "autowifi" { flakeIgnore = [ "E501" ]; } <stockholm/lass/5pkgs/autowifi/autowifi.py>;
profile = name: custom: lib.recursiveUpdate {
connection.id = name;
connection.type = "wifi";
@@ -83,18 +82,5 @@ in
users.users.me.extraGroups = [ "networkmanager" ];
systemd.services.autowifi = {
enable = false;
description = "Automatic wifi connector";
wantedBy = [ "multi-user.target" ];
path = [ pkgs.networkmanager ];
serviceConfig = {
Type = "simple";
Restart = "always";
RestartSec = "10s";
ExecStart = "${autowifi}/bin/autowifi";
};
};
environment.systemPackages = [ pkgs.speedtest-cli ];
}

View File

@@ -1,10 +1,14 @@
{ pkgs, ... }:
{
# enable `nix flake`
nixpkgs = {
config.allowUnfree = true;
overlays = [
(import <nix-writers/pkgs>)
(import <stockholm/krebs/5pkgs>)
];
};
nix = {
package = pkgs.nix;
# extraOptions = ''
# experimental-features = nix-command
# '';
package = pkgs.nixUnstable;
extraOptions = "experimental-features = nix-command flakes";
};
}

View File

@@ -2,46 +2,60 @@
let
hc = pkgs.callPackage <stockholm/tv/5pkgs/simple/hc.nix> {};
worldradio = pkgs.callPackage <niveum/packages/worldradio.nix> {};
menstruation = pkgs.callPackage <niveum/submodules/menstruation-backend> {};
menstruation = pkgs.callPackage <menstruation-backend> {};
pandoc-doc = pkgs.callPackage <niveum/packages/man/pandoc.nix> {};
nixpkgs-unstable = import <nixpkgs-unstable> { config.allowUnfree = true; };
recht = pkgs.callPackage (pkgs.fetchFromGitHub {
owner = "kmein";
repo = "recht";
rev = "0.6.2";
sha256 = "08gnrnz3lwh8h6fyga56yfy9qryzm89xbshm7wpxfyxf2pmp1qfx";
}) {};
zoteroStyle = { name, sha256 }: {
name = "${name}.csl";
path = pkgs.fetchurl {
url = "https://www.zotero.org/styles/${name}";
inherit sha256;
};
};
cslDirectory = pkgs.linkFarm "citation-styles" [
(zoteroStyle {
name = "chicago-author-date-de";
sha256 = "0fz0xn46rkciblr34a7x2v60j0lbq9l3fmzi43iphph27m0czn6s";
})
(zoteroStyle {
name = "din-1505-2";
sha256 = "1pvy1b7qm13mnph7z365rrz1j082bl2y8ih73rhzd0zd6dz1jyjq";
})
(zoteroStyle {
name = "apa";
sha256 = "1878vxp0y0h05yzaghnd51n981623mxskw3lsdyzmffqhihvv111";
})
];
astrolog = nixpkgs-unstable.astrolog.overrideAttrs (old: old // {
installPhase = ''
${old.installPhase}
# set sensible defaults
sed -i '
/^-z /s/8:00W/1:00E/ # timezone
/^-zl /s/122W19:59 47N36:35/13E22:42 52N27:42/ # default location
/^-zj /s/"Current moment now"/Now/ # default name
/^-zj /s/"Seattle, WA, USA"/Berlin/ # default location
/^_k/s/_k/=k/ # use color
/^_Yd/s/_Yd/=Yd/ # sensible date format
/^_Yt/s/_Yt/=Yt/ # sensible time format
/^_Yv/s/_Yv/=Yv/ # sensible length format
/^:Xbw/s/:Xbw/:Xbn/ # set X11 bitmap format
/^:I /s/80/120/ # wider text output
' $out/astrolog/astrolog.as
'';
});
recht = pkgs.callPackage <recht> {};
in {
imports = [
./writing.nix
./python.nix
./haskell
{
environment.systemPackages = let
# nightly = pkgs.rustChannelOf {
# date = "2019-12-27";
# channel = "nightly";
# };
in with pkgs; [
htmlTidy
nodePackages.csslint
nodePackages.jsonlint
nodePackages.prettier
nodePackages.typescript
nodePackages.yarn
nodejs
nodePackages.javascript-typescript-langserver
tokei # count lines of code
gnumake
binutils # for strip, ld, ...
# nightly.rust
shellcheck
];
}
];
home-manager.users.me.home.file = {
".csl".source = cslDirectory;
".local/share/pandoc/csl".source = cslDirectory; # as of pandoc 2.11, it includes citeproc
};
environment.systemPackages = with pkgs; [
# INTERNET
@@ -51,9 +65,7 @@ in {
w3m
wget
whois
ix
dnsutils
# mtr # my traceroute
# FILE MANAGERS
ranger
pcmanfm
@@ -61,7 +73,6 @@ in {
ffmpeg
imagemagick
exiftool
scrot
# ARCHIVE TOOLS
unzip
unrar
@@ -82,19 +93,17 @@ in {
python3Packages.jsonschema # json validation
jq # json toolkit
pup # html toolkit
nixpkgs-unstable.htmlq
htmlq
xsv # csv toolkit
xmlstarlet # xml toolkit
manpages
posix_man_pages
# moreutils # for parallel, sponge, combine
tree
fuse_exfat # to mount windows drives
parallel # for parallel, since moreutils shadows task spooler
ripgrep # better grep
rlwrap
progress # display progress bars for pipes
up # universal plumber (piping tool)
# HARDWARE TOOLS
usbutils # for lsusb
pciutils # for lspci
@@ -107,19 +116,26 @@ in {
audacity
calibre
inkscape
astrolog
anki # flashcards
jbofihe # lojbanic software
nixpkgs-unstable.zoom-us # video conferencing
pdfgrep # search in pdf
pdftk # pdf toolkit
mupdf
poppler_utils # pdf toolkit
foxitreader # for viewing pdf annotations
xournalpp # for annotating pdfs
pdfpc # presenter console for pdf slides
hc # print files as qr codes
youtubeDL
espeak
bc # calculator
pari # gp -- better calculator
scripts.auc
scripts.infschmv
scripts.qrpaste
scripts.ttspaste
scripts.new-mac # get a new mac address
scripts.scanned
scripts.default-gateway
@@ -136,11 +152,8 @@ in {
recht
scripts.vimv
scripts.swallow # window swallowing
scripts.genius
scripts.instaget
scripts.literature-quote
scripts.nav # json navigation
scripts.n
scripts.notetags
scripts.booksplit
scripts.dmenurandr
@@ -153,24 +166,23 @@ in {
scripts.vg
scripts.fkill
scripts.wttr
scripts.sanskrit-dictionary
scripts.unicodmenu
scripts.horoscope
scripts.closest
scripts.trans
scripts.liddel-scott-jones
scripts.mpv-radio
# kmein.slide
scripts.tolino-screensaver
scripts.rfc
scripts.tag
scripts.timer
python3Packages.eyeD3
scripts.menu-calc
nix-prefetch-git
scripts.nix-git
nixfmt
par
qrencode
wtf
menstruation
@@ -185,7 +197,7 @@ in {
(pkgs.writers.writeDashBin "ncmpcpp-zaatar" ''MPD_HOST=${(import <niveum/lib/local-network.nix>).zaatar} exec ${pkgs.ncmpcpp}/bin/ncmpcpp "$@"'')
(pkgs.writers.writeDashBin "mpc-zaatar" ''MPD_HOST=${(import <niveum/lib/local-network.nix>).zaatar} exec ${pkgs.mpc_cli}/bin/mpc "$@"'')
nixpkgs-unstable.spotify
spotify
ncspot
playerctl
@@ -200,6 +212,53 @@ in {
irc-announce
git-preview
ircaids
(python3.withPackages (py: [
py.black
# py.python-language-server
# py.pyls-mypy
# py.pyls-black
# py.pyls-isort
py.flake8
py.pygments
py.schema
]))
python3Packages.poetry
htmlTidy
nodePackages.csslint
nodePackages.jsonlint
nodePackages.prettier
nodePackages.typescript
nodePackages.yarn
nodejs
nodePackages.javascript-typescript-langserver
texlive.combined.scheme-full
latexrun
(aspellWithDicts (dict: [ dict.de dict.en dict.en-computers ]))
# haskellPackages.pandoc-citeproc
scripts.text2pdf
lowdown
glow # markdown to term
libreoffice
# gnumeric
dia
pandoc
pandoc-doc
# proselint
asciidoctor
wordnet
tokei # count lines of code
gnumake
binutils # for strip, ld, ...
# nightly.rust
shellcheck
];
home-manager.users.me.xdg.configFile."pycodestyle".text = ''
[pycodestyle]
max-line-length = 110
'';
}

View File

@@ -1,46 +0,0 @@
{ config, pkgs, ... }: {
home-manager.users.me.home.file = {
".ghc/ghci.conf".text = ''
:set editor vim
:def hoogle \s -> return $ ":!${pkgs.haskellPackages.hoogle}/bin/hoogle search --color -l --count=15 \"" ++ s ++ "\""
:def doc \s -> return $ ":!${pkgs.haskellPackages.hoogle}/bin/hoogle search --color -l --info \"" ++ s ++ "\""
:set prompt "\o033[1m%s\o033[1;34m λ\o033[0m "
:set -Wall
:set -XOverloadedStrings
'';
# :def unpl \x -> return $ ":!${pkgs.haskellPackages.pointful}/bin/pointful \"" ++ x ++ "\""
# :def pl \x -> return $ ":!${pkgs.haskellPackages.pointfree}/bin/pointfree -v \"" ++ x ++ "\""
".stack/config.yaml".source =
let inherit (import <niveum/lib>) kieran;
in (pkgs.formats.yaml {}).generate "config.yaml" {
templates.params = {
author-name = kieran.name;
author-email = kieran.email;
copyright = "Copyright: (c) 2020 ${kieran.name}";
github-username = kieran.github;
};
};
};
services.hoogle = {
enable = false;
packages = import ./packages.nix;
port = 8091;
};
environment.systemPackages = with pkgs;
[
cabal2nix
cabal-install
hlint
haskellPackages.ormolu
(haskellPackages.ghcWithHoogle (import ./packages.nix))
] ++ map haskell.lib.justStaticExecutables [
haskellPackages.ghcid
haskellPackages.hasktags
# haskellPackages.hindent
# haskellPackages.pointfree
# haskellPackages.pointful
haskellPackages.hpack
];
}

View File

@@ -1,100 +0,0 @@
haskellPackages:
with haskellPackages; [
HTTP
HUnit
MissingH
QuickCheck
ad
adjunctions
aeson
# algebra
ansi-terminal
async
attoparsec
base-orphans
bifunctors
binary
blaze-html
blaze-markup
brick
bytes
bytestring
case-insensitive
cassava
cereal
clock
comonad
comonad-transformers
conduit
conduit-extra
constraints
containers
contravariant
criterion
data-default
diagrams
directory
dlist
either
edit-distance
exceptions
extra
filepath
foundation
free
haskeline
hedgehog
hourglass
hspec
http-client
http-conduit
kan-extensions
lens
linear
lucid
megaparsec
microlens
monad-logger
monad-memo
mono-traversable
mtl
network
parallel
parsec
persistent
pipes
pointed
pretty
pretty-show
prettyprinter
primitive
process
profunctors
regex-tdfa
safe
scalpel
semigroupoids
semigroups
servant
servant-blaze
servant-client
servant-docs
servant-server
servant-swagger
split
stm
tagsoup
tasty
text
time
transformers
turtle
unix-time
unordered-containers
vector
void
vty
warp
wreq
yaml
]

View File

@@ -1,20 +0,0 @@
{ pkgs, ... }: {
environment.systemPackages = [
(pkgs.python3.withPackages (py: [
py.black
# py.python-language-server
# py.pyls-mypy
# py.pyls-black
# py.pyls-isort
py.flake8
py.pygments
py.schema
]))
pkgs.python3Packages.poetry
];
home-manager.users.me.xdg.configFile."pycodestyle".text = ''
[pycodestyle]
max-line-length = 110
'';
}

View File

@@ -1,78 +0,0 @@
{ pkgs, lib, config, ... }:
let
zoteroStyle = { name, sha256 }: {
name = "${name}.csl";
path = pkgs.fetchurl {
url = "https://www.zotero.org/styles/${name}";
inherit sha256;
};
};
cslDirectory = pkgs.linkFarm "citation-styles" [
(zoteroStyle {
name = "chicago-author-date-de";
sha256 = "0fz0xn46rkciblr34a7x2v60j0lbq9l3fmzi43iphph27m0czn6s";
})
(zoteroStyle {
name = "din-1505-2";
sha256 = "1pvy1b7qm13mnph7z365rrz1j082bl2y8ih73rhzd0zd6dz1jyjq";
})
(zoteroStyle {
name = "apa";
sha256 = "1878vxp0y0h05yzaghnd51n981623mxskw3lsdyzmffqhihvv111";
})
];
makeStardictDataDir = dicts:
pkgs.linkFarm "dictionaries" (map ({ name, path }: {
name = "dic/${name}";
inherit path;
}) dicts);
in {
environment.variables.STARDICT_DATA_DIR = toString (makeStardictDataDir [
{
name = "gr-de";
path = pkgs.fetchurl {
url = "http://tovotu.de/data/stardict/pape_gr-de.zip";
sha256 = "1d705y47b40vp0mg79vbwasw4y0i8fmnlwvf4x4ri0dkfqng9sky";
};
}
{
name = "la-de";
path = pkgs.fetchurl {
url = "http://tovotu.de/data/stardict/georges_lat-de.zip";
sha256 = "12n26nzwg28wn4zwv45mv0wkgy1jh1d8p0k6haamz9601cqq7hkj";
};
}
{
name = "de-la";
path = pkgs.fetchurl {
url = "http://tovotu.de/data/stardict/georges_de-lat.zip";
sha256 = "0inm6xn1lcnb851cj329n0v2vbfc1z1bxwhgsd8fnm0zxy3f3ifq";
};
}
]);
home-manager.users.me.home.file = {
".csl".source = cslDirectory;
".local/share/pandoc/csl".source = cslDirectory; # as of pandoc 2.11, it includes citeproc
};
environment.systemPackages = with pkgs; [
texlive.combined.scheme-full
latexrun
(aspellWithDicts (dict: [ dict.de dict.en dict.en-computers ]))
# haskellPackages.pandoc-citeproc
scripts.text2pdf
lowdown
glow # markdown to term
libreoffice
# gnumeric
dia
pandoc
# proselint
asciidoctor
wordnet
# sdcv # stardict cli
];
}

13
configs/polkit.nix Normal file
View File

@@ -0,0 +1,13 @@
{ config, ... }:
let
user = config.users.users.me.name;
in
{
security.polkit.extraConfig = ''
polkit.addRule(function(action, subject) {
if (subject.user == "${user}" && action.id == "org.freedesktop.systemd1.manage-units") {
return polkit.Result.YES;
}
});
'';
}

View File

@@ -1,212 +0,0 @@
{ lib, pkgs, config, ... }:
let
inherit (import <niveum/lib>) tmpfilesConfig serveHtml;
radioStore = "/var/lib/radio";
htgenPort = 8080;
stations = {
lyrikline = {
streamPort = 8001;
mpdPort = 6601;
description = ''
Weltklang. Welt als ewiges Gedicht, das seine Schallspuren durch Raum und Zeit jagt. Endlose Zufallswiedergabe von <a href="//lyrikline.org">lyrikline</a>. Listen to the sound of voices and poems permeating linguistic and geographic barriers, 24 hours per day.
'';
};
lyrik = {
streamPort = 8002;
mpdPort = 6602;
description = ''
Deutsche Lyrik, die du noch nicht gut genug kennst. Tritt in einen Fluss aus Reim und Maß; keine zwei Mal ist er derselbe.
'';
};
};
mpd-add-with-tags = pkgs.writers.writeHaskell "mpd-add-with-tags" {
libraries = with pkgs.haskellPackages; [ optparse-generic libmpd ];
} ''
{-# LANGUAGE DeriveGeneric, OverloadedStrings #-}
import Control.Monad (void)
import Data.String
import Network.MPD
import Options.Generic
data Options = Options { url :: String, artist :: Maybe String, title :: Maybe String }
deriving (Generic)
instance ParseRecord Options
main :: IO ()
main = do
options <- getRecord "Add to MPD with tags"
void $ withMPD $ do
songId <- addId (fromString $ url options) Nothing
maybe (pure ()) (addTagId songId Artist . fromString) $ artist options
maybe (pure ()) (addTagId songId Title . fromString) $ title options
'';
mpcs = lib.mapAttrs (name: station: pkgs.writers.writeDashBin "mpc-${name}" ''
MPD_PORT=${toString station.mpdPort} ${pkgs.mpc_cli}/bin/mpc "$@"
'') stations;
in
{
imports = [ <stockholm/krebs/3modules/htgen.nix> ];
nixpkgs.overlays = [
(self: super: { htgen = super.callPackage <stockholm/krebs/5pkgs/simple/htgen> {}; })
];
systemd.tmpfiles.rules = [
(tmpfilesConfig {
type = "d";
path = radioStore;
mode = "0755";
user = config.users.extraUsers.radio.name;
age = "1d";
})
];
users.extraUsers.radio = {
isSystemUser = true;
group = "radio";
};
users.groups.radio = {};
krebs.htgen.radio = {
port = htgenPort;
user.name = "radio";
script = ''. ${pkgs.writers.writeDash "meinskript" ''
send200() {
printf 'HTTP/1.1 200 OK\r\n'
printf 'Content-Type: text/html; charset=UTF-8\r\n'
printf 'Connection: close\r\n'
printf '\r\n'
}
case "$Method $Request_URI" in
"GET /lyrik/status")
send200
video_id="$(
${mpcs.lyrik}/bin/mpc-lyrik status -f %file% \
| head -n1 \
| grep -o 'id=[^&]*' \
| sed 's/^id=//g'
)"
${pkgs.youtube-dl}/bin/youtube-dl -j "https://www.youtube.com/watch?v=$video_id" \
| ${pkgs.jq}/bin/jq -r '"% [\(.title)](\(.webpage_url))\n\n\(.description)"' \
| sed 's/$/ /g' \
| ${pkgs.pandoc}/bin/pandoc -s
exit
;;
"GET /lyrikline/status")
send200
hash="$(
${mpcs.lyrikline}/bin/mpc-lyrikline status -f '%file%' \
| head -n 1 \
| md5sum \
| cut -d' ' -f 1
)"
url="$(cat ${radioStore}/$hash)"
echo "<html><body style='margin:0'><iframe style='width:100%;height:100%;border:0' src="$url"></iframe></body></html>"
exit
;;
esac
''}'';
};
containers = lib.mapAttrs (name: station: {
autoStart = true;
config = {config, pkgs, ...}: {
services.mpd = {
enable = true;
network.port = station.mpdPort;
extraConfig = ''
log_level "default"
audio_output {
name "${name}"
type "httpd"
encoder "vorbis"
port "${toString station.streamPort}"
bitrate "128"
format "44100:16:2"
always_on "yes"
tags "yes"
}
'';
};
};
}) stations;
environment.systemPackages = lib.attrValues mpcs;
systemd.services.lyrikline = {
after = [ "container@lyrikline.service" ];
wantedBy = [ "container@lyrikline.service" ];
startAt = "*:00/5";
serviceConfig.User = config.users.extraUsers.radio.name;
preStart = "${mpcs.lyrikline}/bin/mpc-lyrikline crop || :";
script = ''
set -efu
lyrikline=https://www.lyrikline.org
for _ in $(seq 1 10); do
random_route="$(${pkgs.curl}/bin/curl -sSL "$lyrikline/index.php/tools/getrandompoem" --data-raw 'lang=de' --compressed | ${pkgs.jq}/bin/jq -r .link)"
poem_url="$lyrikline$random_route"
poem_file="$(
${pkgs.curl}/bin/curl -sSL "$poem_url" \
| grep -o 'https://.*\.mp3' \
| head -n1
)"
hash="$(echo "$poem_file" | md5sum | cut -d' ' -f 1)"
echo "$poem_file ($hash) -> $poem_url"
echo "$poem_url" > "${radioStore}/$hash"
${mpcs.lyrikline}/bin/mpc-lyrikline add "$poem_file"
done
${mpcs.lyrikline}/bin/mpc-lyrikline play
'';
};
systemd.services.lyrik = {
after = [ "container@lyrik.service" ];
wantedBy = [ "container@lyrik.service" ];
preStart = "${mpcs.lyrik}/bin/mpc-lyrik crop || :";
restartIfChanged = true;
serviceConfig.User = config.users.extraUsers.radio.name;
script =
let
invidious = "https://invidious.silkky.cloud";
videoIds = import <niveum/lib/hot-rotation/lyrik.nix>;
streams = lib.concatMapStringsSep "\n" (id: "${invidious}/latest_version?id=${id}&itag=251") videoIds;
streamsFile = pkgs.writeText "hotrot" streams;
in ''
set -efu
${mpcs.lyrik}/bin/mpc-lyrik add < ${toString streamsFile}
${mpcs.lyrik}/bin/mpc-lyrik crossfade 5
${mpcs.lyrik}/bin/mpc-lyrik random on
${mpcs.lyrik}/bin/mpc-lyrik repeat on
${mpcs.lyrik}/bin/mpc-lyrik play
'';
};
services.nginx.virtualHosts."radio.kmein.de" = {
enableACME = true;
forceSSL = true;
locations = lib.mkMerge (
[
{ "/".extraConfig = serveHtml (import ./station-list.nix { inherit pkgs lib stations; }) pkgs; }
] ++ (lib.mapAttrsToList (name: station: {
"= /${name}/status".proxyPass = "http://127.0.0.1:${toString htgenPort}";
"= /${name}/listen.ogg".proxyPass = "http://127.0.0.1:${toString station.streamPort}";
"= /${name}.ogg".return = "301 http://radio.xn--kiern-0qa.de/${name}/listen.ogg"; # legacy
}) stations)
);
};
}

View File

@@ -1,43 +0,0 @@
{ pkgs, lib, stations }:
let
theStations = lib.mapAttrsToList (name: value: value // {name = name;}) stations;
in
pkgs.writeText "index.html" ''
<!doctype html>
<html>
<head>
<title>radio.kierán</title>
<link
rel="stylesheet"
href="//cdn.rawgit.com/necolas/normalize.css/master/normalize.css"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.9.2/css/bulma.min.css"
/>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charset="utf-8" />
</head>
<body>
<main class="section">
<div class="subtitle is-3">Welcome to</div>
<h1 class="title is-1">radio.kierán</h1>
<div class="columns is-multiline">
${lib.concatMapStringsSep "\n" (station: ''
<div class="column">
<div class="box">
<strong class="is-uppercase">${station.name}</strong>
(<a href="/${station.name}/status">status</a>, <a href="/${station.name}/listen.ogg">link</a>)
<p class="has-text-grey">${station.description}</p>
<hr/>
<audio style="width:100%" controls src="/${station.name}/listen.ogg"/>
</div>
</div>'') theStations
}
</div>
</main>
</body>
</html>
''

View File

@@ -1,9 +1,10 @@
{ config, ... }:
{ config, pkgs, ... }:
let
inherit (import <niveum/lib>) colours;
in{
home-manager.users.me.programs.rofi = {
enable = true;
font = "Monospace 10";
theme = "${pkgs.rofi}/share/rofi/themes/Arc-Dark.rasi";
};
}

357
configs/stardict.nix Normal file
View File

@@ -0,0 +1,357 @@
{ config, pkgs, lib, ... }:
let
dictionaries = {
lojban = {
jbo-deu = pkgs.fetchzip {
url = "https://guskant.github.io/lojbo/stardict/jbo-deu-20160110.tar.gz";
sha256 = "18ia15wyvd8ksi7yxn939qmvpdlrip8mvfywafv7vjj685rdhk80";
};
rafsi-jbo = pkgs.fetchzip {
url = "https://guskant.github.io/lojbo/stardict/rafsi-jbo-20160110.tar.gz";
sha256 = "00fkw964b48liz1jayfjb5jnpwihghkq4i28y8i11yqb56w6bn3c";
};
jbo-eng = pkgs.fetchzip {
url = "https://guskant.github.io/lojbo/stardict/jbo-eng-20160110.tar.gz";
sha256 = "15l65yshqdp0a7fr4a7ffwx3m2v6ymchxgra9zmk5bsgcxsb4r8m";
};
jbo-jbo = pkgs.fetchzip {
url = "https://guskant.github.io/lojbo/stardict/jbo-jbo-20160110.tar.gz";
sha256 = "1psfyrjrq84prr2s4jcm31ijykm7clyqygmbacr09n570xfwqcfw";
};
};
classics = {
Pape = pkgs.fetchzip {
url = "http://tovotu.de/data/stardict/pape_gr-de.zip";
sha256 = "1kmbdjqinrcxkc6jdyyrq5rl2wzhnrychyynnh91yhrjwjxlh44k";
};
Woodhouse = pkgs.fetchzip {
url = "https://c.krebsco.de/Woodhouse.zip";
sha256 = "1dvnc2679yb048q2f3hr2h34acvhan0n3iir6h9ajlrdzz48mlkq";
stripRoot = false;
};
LSJ = pkgs.fetchzip {
url = "https://github.com/nikita-moor/latin-dictionary/releases/download/2020-02-14/LiddellScott1940-stardict.zip";
sha256 = "13rprgd9jvnhxk9735c91xr6ywr0j5jiwkjnpm3qpvy93isyjbys";
};
GreekMorphology = pkgs.fetchzip {
url = "https://github.com/latin-dict/Morphologia-Graeca/releases/download/v0.5/morphology-mobile-goldendict.oxia.zip";
sha256 = "0m75cppjjjmvv18cs7yh9f4p7ckqzxfznnndgkiw3yrfd50k8p96";
};
Frisk = pkgs.fetchzip {
url = "https://github.com/latin-dict/Frisk1960/releases/download/v1.1/Frisk1960-stardict.zip";
sha256 = "1rk5a3n3fpfdcmg4bc5945m88s6ldxql8cjn4jqs33rgklh7n046";
};
Georges-De-Lat = pkgs.fetchzip {
url = "http://tovotu.de/data/stardict/georges_de-lat.zip";
sha256 = "1gx4vv64bi9lxw2zgd861j469jvw4f2hhfwy1gglb12id8r7rdrl";
};
Georges-Lat-De = pkgs.fetchzip {
url = "http://tovotu.de/data/stardict/georges_lat-de.zip";
sha256 = "0cc5xipn60anxvq8z2mw53d4gi1k92wbrj9m4ws3g9rh87fmkvgz";
};
LewisShort = pkgs.fetchzip {
url = "https://github.com/latin-dict/LewisShort1879/releases/download/v1.3/LewisShort1879-stardict.zip";
sha256 = "1y3ans47iv8bzzb1paimdqvcid8ms04ikjbqy3iw077i2js3qbjk";
};
DoederleinSynonymes = pkgs.fetchzip {
url = "https://github.com/latin-dict/Doederlein1874/releases/download/v1.1/Doederlein1875-stardict.zip";
sha256 = "0mhik7gjxl8ncr9g5z2l4pfk60k1c5n0gc1w0cnp2x1v6lqvb57h";
};
};
englishGerman = {
Etymonline = pkgs.fetchzip {
url = "http://tovotu.de/data/stardict/etymonline.zip";
sha256 = "1bjja3n3layfd08xa1r0a6375dxh5zi6hlv7chkhgnx800cx7hxn";
};
Roget = pkgs.fetchzip {
url = "http://download.huzheng.org/bigdict/stardict-Roget_s_II_The_New_Thesaurus_3th_Ed-2.4.2.tar.bz2";
sha256 = "1szyny9497bpyyccf9l5kr3bnw0wvl4cnsd0n1zscxpyzlsrqqbz";
};
JargonFile = pkgs.fetchzip {
url = "http://download.huzheng.org/dict.org/stardict-dictd-jargon-2.4.2.tar.bz2";
sha256 = "096phar9qpmm0fnaqv5nz8x9lpxwnfj78g4vjfcfyd7kqp7iqla4";
};
Oxford-Collocations = pkgs.fetchzip {
url = "http://download.huzheng.org/bigdict/stardict-Oxford_Collocations_Dictionary_2nd_Ed-2.4.2.tar.bz2";
sha256 = "1zkfs0zxkcn21z2lhcabrs77v4ma9hpv7qm119hpyi1d8ajcw07q";
};
Langenscheidt-Deu-En = pkgs.fetchzip {
url = "http://download.huzheng.org/babylon/german/stardict-Handw_rterbuch_Deutsch_Englisc-2.4.2.tar.bz2";
sha256 = "12q9i5azq7ylyrpb6jqbaf1rxalc3kzcwjvbinvb0yabdxb80y30";
};
Langenscheidt-En-Deu = pkgs.fetchzip {
url = "http://download.huzheng.org/babylon/german/stardict-Handw_rterbuch_Englisch_Deutsc-2.4.2.tar.bz2";
sha256 = "087b05h155j5ldshfgx91pz81h6ijq2zaqjirg7ma8ig3l96zb59";
};
Duden_Das_Fremdworterbuch = pkgs.fetchzip {
url = "http://download.huzheng.org/babylon/german/stardict-Duden_Das_Fremdworterbuch-2.4.2.tar.bz2";
sha256 = "1zrcay54ccl031s6dvjwsah5slhanmjab87d81rxlcy8fx0xd8wq";
};
Duden_De_De = pkgs.fetchzip {
url = "http://download.huzheng.org/babylon/german/stardict-Duden_De_De-2.4.2.tar.bz2";
sha256 = "1fhay04w5aaj83axfmla2ql34nb60gb05dgv0k94ig7p8x4yxxlf";
};
ConciseOED = pkgs.fetchzip {
url = "http://download.huzheng.org/bigdict/stardict-Concise_Oxford_English_Dictionary-2.4.2.tar.bz2";
sha256 = "19kpcxbhqzpmhi94mp48nalgmsh6s7rsx1gb4kwkhirp2pbjcyl7";
};
Duden_Synonym = pkgs.fetchzip {
url = "http://download.huzheng.org/babylon/german/stardict-Duden_Synonym-2.4.2.tar.bz2";
sha256 = "0cx086zvb86bmz7i8vnsch4cj4fb0cp165g4hig4982zakj6f2jd";
};
};
sanskrit = let repo = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f"; in {
BoehtlingkRoth = pkgs.fetchzip {
url = "${repo}/sa-head/german-entries/tars/Bohtlingk-and-Roth-Grosses-Petersburger-Worterbuch__2021-10-05_14-23-18Z__19MB.tar.gz";
sha256 = "13414a8rgd7hd5ffar6nl68nk3ys60wjkgb7m11hp0ahaasmf6ly";
stripRoot = false;
};
BoehtlingkRothKurz = pkgs.fetchzip {
url = "${repo}/sa-head/german-entries/tars/Bohtlingk-Sanskrit-Worterbuch-in-kurzerer-Fassung__2021-10-05_14-23-18Z__10MB.tar.gz";
sha256 = "15yx31yrk40k9nn6kaysp4pprzj8dpd13dj3wafklc3izm8lr2wq";
stripRoot = false;
};
MonierWilliams = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/mw-cologne__2021-10-06_00-16-23Z__16MB.tar.gz";
sha256 = "0p99ybxwxmmd94hf035hvm2hhnfy84av7qq79xf28bh2rbx6s9ng";
stripRoot = false;
};
MonierWilliamsEnglish = pkgs.fetchzip {
url = "${repo}/en-head/tars/mw-english-sanskrit__2021-10-05_14-23-18Z__3MB.tar.gz";
sha256 = "09a61hhii4b1m2fkrlh4rm2xnlgwrllh84iypbc6wyj00w9jkl3x";
stripRoot = false;
};
Borooah = pkgs.fetchzip {
url = "${repo}/en-head/tars/borooah__2021-10-05_14-23-18Z__2MB.tar.gz";
sha256 = "0qmmfbynqgv125v48383i51ky9yi69zibhh7vwk95gyar2yrprn2";
stripRoot = false;
};
ApteEnglish = pkgs.fetchzip {
url = "${repo}/en-head/tars/apte-english-sanskrit-cologne__2021-10-06_00-12-51Z__1MB.tar.gz";
sha256 = "064ysm24ydc534ca689y5i2flnra8jkmh8zn0gsb6n8hdsb0d1lq";
stripRoot = false;
};
};
oed = {
OED1 = pkgs.fetchzip {
url = "http://download.huzheng.org/bigdict/stardict-Oxford_English_Dictionary_2nd_Ed._P1-2.4.2.tar.bz2";
sha256 = "0i5vv1rv44yfwyf9bfbdrb9brzhhpvz2jnh39fv8hh107nkv2vcf";
};
OED2 = pkgs.fetchzip {
url = "http://download.huzheng.org/bigdict/stardict-Oxford_English_Dictionary_2nd_Ed._P2-2.4.2.tar.bz2";
sha256 = "1pk234pbq4pk55d8sjk0pp9j5sajm82f8804kf2xm2x5p387q1rg";
};
};
russian = {
LingvoGermanRussian = pkgs.fetchzip {
url = "http://download.huzheng.org/lingvo/stardict-GR-LingvoUniversal-2.4.2.tar.bz2";
sha256 = "0p353gs2z4vj70hqsdhffjaaw3a4zlmcs46flipmf35lm5wmaj0g";
};
LingvoRussianGerman = pkgs.fetchzip {
url = "http://download.huzheng.org/lingvo/stardict-RG-LingvoUniversal-2.4.2.tar.bz2";
sha256 = "03f9wdmkgpjifpms7dyh10ma29wf3ka1j3zlp1av0cybhdldk2a8";
};
};
};
makeStardictDataDir = dicts: pkgs.linkFarm "dictionaries" (lib.mapAttrsToList (name: path: { inherit name path; }) dicts);
makeStardict = name: dicts: pkgs.writers.writeDashBin name ''
set -efu
export SDCV_PAGER=${toString sdcvPager}
exec ${pkgs.sdcv}/bin/sdcv --color --only-data-dir --data-dir ${makeStardictDataDir dicts} "$@"
'';
sdcvPager = pkgs.writeDash "sdcvPager" ''
export PATH=${lib.makeBinPath [pkgs.gnused pkgs.ncurses pkgs.less]}
sed "
s!<sup>1</sup>!¹!gI
s!<sup>2</sup>!²!gI
s!<sup>3</sup>!³!gI
s!<sup>4</sup>!!gI
s! style=\"color: #...\"!!g;
s!<span class=\"zenoTXSpaced\">\([^<>]*\)</span>!\1!g;
s!</\?dictionary[^>]*>!!g;
s!<style.*</style>!!g;
s!<author>\([^<>]*\)</author>!\1 !g;
s!<quote lang=\"\(greek\|la\)\">\([^<>]*\)</quote>!$(tput sitm)\2$(tput sgr0)!g;
s!<biblScope>\([^<>]*\)</biblScope>!\1!g;
s!<mood>\([^<>]*\)</mood>!$(tput sitm)\1$(tput sgr0)!g;
s!<adv>\([^<>]*\)</adv>!$(tput sitm)\1$(tput sgr0)!g;
s!<gram[^>]*>\([^<>]*\)</gram>!$(tput sitm)\1$(tput sgr0)!g;
s!<bibl_title>\([^<>]*\)</bibl_title>!$(tput sitm)\1$(tput sgr0) !g;
s!<hi rend=\"ital\">\([^<>]*\)</hi>!$(tput sitm)\1$(tput sgr0) !g;
s!<dict_tr>\([^<>]*\)</dict_tr>!$(tput setaf 3)\1$(tput sgr0)!g;
s!<headword>\([^<>]*\)</headword>!$(tput bold)\1$(tput sgr0)\t!g;
s!</\?a[^>]*>!!g
s!</\?[cp]b[^>]*>!!g
s!</\?gramGrp[^>]*>!!g
s!</\?lbl[^>]*>!!g
s!</\?xr[^>]*>!!g
s!</\?pron[^>]*>!!g
s!</\?gen[^>]*>!!g
s!</\?tns[^>]*>!!g
s!</\?per[^>]*>!!g
s!</\?blockquote[^>]*>!!g
s!</\?etym[^>]*>!!g
s!<foreign[^>]*>!$(tput sitm)!g
s!</foreign[^>]*>!$(tput sgr0)!g
s!</\?date[^>]*>!!g
s!</\?placeName[^>]*>!!g
s!</\?itype[^>]*>!!g
s!</\?p>!!g
s!<input[^>]*>!!g
s!</\?orth[^>]*>!!g
s!</\?number[^>]*>!!g
s!</\?forename[^>]*>!!g
s!</\?persName[^>]*>!!g
s!</\?surname[^>]*>!!g
s!</\?entryFree[^>]*>!!g
s!</\?def[^>]*>!!g
s!</\?cit[^>]*>!!g
s!</\?pos[^>]*>!!g
s!</\?usg[^>]*>!!g
s!</\?ul>!!g
s!<li>!\n!g
s!</li>!!g
s!<bibl[^>]*>!$(tput setaf 245)!g
s!</bibl[^>]*>!$(tput sgr0)!g
s/<dt>/$(tput bold)/g;
s:</dt>:$(tput sgr0):g;
s/<dd>/\n/g;
s:</dd>::g;
s:<script>.*</script>::g;
s/<b>/$(tput bold)/gI;
s:</b>:$(tput sgr0):gI;
s:<br\s*/\?>:\n:gI;
s:<i>:$(tput sitm):gI;
s:</i>:$(tput sgr0):gI;
s:<u>:$(tput smul):gI;
s:</u>:$(tput sgr0):gI;
s:<FONT face=[^>]*>::g;
s:</FONT>::g;
s!<head>\([^<>]*\)</head>!$(tput bold)\1$(tput sgr0)!g;
s!<span lang=\"\(gr\|la\)\">\([^<>]*\)</span>!\2!g
s#<div style=\"margin-left:1em\">\(.*\)</div>#\\1#g;
s:<font color=\"brown\">\([^<>]*\)</font>:$(tput setaf 3)\\1$(tput sgr0):g;
s:<font color=\"blue\">\([^<>]*\)</font>:$(tput setaf 4)\\1$(tput sgr0):g;
s:<font color=\"red\">\([^<>]*\)</font>:$(tput setaf 1)\\1$(tput sgr0):g;
s:<font color=\"darkviolet\">\([^<>]*\)</font>:$(tput setaf 5)\\1$(tput sgr0):g;
s:<font color=\"#a0a\">\([^<>]*\)</font>:$(tput bold)\1$(tput sgr0):g
s:<font color=\"#838\">\([^<>]*\)</font>:$(tput setaf 3)\1$(tput sgr0):g
s:&#x27;:':g
s:&lt;:<:g
s:&gt;:>:g
s:<font color=\"#007000\">\([^<>]*\)</font>:$(tput setaf 2)\\1$(tput sgr0):g;
s:<font color=\"#007000\">\([^<>]*\)</font>:$(tput setaf 2)\\1$(tput sgr0):g;
s:<font color=#000099>\([^<>]*\)</font>:$(tput setaf 4)\\1$(tput sgr0):g;
s:<font color=0000FF>\([^<>]*\)</font>:$(tput bold)\\1$(tput sgr0):g;
s:<IMG src=\"223E9A06.bmp\"[^>]*>:ː:g;
s:<IMG src=\"502F5DDA.bmp\"[^>]*>::g;
s:<IMG src=\"8DAD7054.bmp\"[^>]*>:n̩:g
s!</\?TABLE>!!gI
s!</\?TR[^>]*>!!gI
s!</\?TD>!!gI
s!</\?FONT[^>]*>!!gI
s!</\?A[^>]*>!!gI
s!<SPAN class=\"bsptext\">\([^<>]*\)</SPAN>!$(tput setaf 245)\1$(tput sgr0)!g
s! +! !g;
s!<div part=\"[^\"]*\">!\n\n&!g
s!<sense n=\"\([^\"]*\)\"!\n$(tput setaf 5)\1.$(tput sgr0) &!g;
s!</\?sense[^>]*>!!g
s!</\?div[^>]*>!!g
s!<span lang=\"gr\">!!g # unbalanced in Frisk
s!^\s*[0-9])!$(tput setaf 5)&$(tput sgr0)!g
s!</\?span[^>]*>!!gI
s!</\?p[^>]*>!!gI
" | less -FR
'';
in
{
environment.etc.stardict.source = toString (makeStardictDataDir ({
Crum = pkgs.fetchzip {
url = "http://download.huzheng.org/misc/stardict-Coptic-English_all_dialects-2.4.2.tar.bz2";
sha256 = "1fi281mb9yzv40wjsdapi8fzpa7x2yscz582lv2qnss9g8zzzzr9";
};
SmithBiographyMythology = pkgs.fetchzip {
url = "https://github.com/latin-dict/Smith1873/releases/download/v1.0/Smith1873-stardict.zip";
sha256 = "01h5fxacp2m60xir8kzslkfy772vs3vmz07zhdwfhcwdaxif2af2";
};
SmithAntiquities = pkgs.fetchzip {
url = "https://github.com/latin-dict/Smith1890/releases/download/v1.0/Smith1890-stardict.zip";
sha256 = "0vpsv62p2lrzmgys4d1swpnc6lqhdi7rxwkj2ngy3lz5dk3fysyb";
};
} // dictionaries.classics // dictionaries.sanskrit // dictionaries.oed // dictionaries.russian // dictionaries.englishGerman));
environment.systemPackages = [
pkgs.goldendict
(makeStardict "lsj" dictionaries.classics)
(makeStardict "sa" dictionaries.sanskrit)
(makeStardict "oed" dictionaries.oed)
(makeStardict "sd-russian" dictionaries.russian)
(makeStardict "sd" dictionaries.englishGerman)
(makeStardict "jbo" dictionaries.lojban)
];
}
/*
https://github.com/latin-dict/Georges1910/releases/download/v1.0/Georges1910-stardict.zip
https://github.com/nikita-moor/latin-dictionary/releases/download/2020-02-14/LiddellScott1940-stardict.zip
http://download.huzheng.org/bigdict/stardict-Cambridge_Dictionary_of_American_Idioms-2.4.2.tar.bz2
http://download.huzheng.org/bigdict/stardict-Concise_Oxford_Thesaurus_2nd_Ed-2.4.2.tar.bz2
http://download.huzheng.org/bigdict/stardict-Urban_Dictionary_P1-2.4.2.tar.bz2
http://download.huzheng.org/bigdict/stardict-Urban_Dictionary_P2-2.4.2.tar.bz2
Duden_Rechtschreibung = pkgs.fetchzip {
url = "http://download.huzheng.org/babylon/german/stardict-Duden_Rechtschreibung-2.4.2.tar.bz2";
sha256 = "0xiprb45s88w62rn8rlbjrsagbiliay9hszsiy20glwabf6zsfji";
};
Duden = pkgs.fetchzip {
url = "http://download.huzheng.org/de/stardict-duden-2.4.2.tar.bz2";
sha256 = "049i4ynfqqxykv1nlkyks94mvn14s22qdax5gg7hx1ks5y4xw64j";
};
FreeOnlineDictionaryOfComputing = pkgs.fetchzip {
url = "http://download.huzheng.org/dict.org/stardict-dictd_www.dict.org_foldoc-2.4.2.tar.bz2";
sha256 = "1lw2i8dzxpx929cpgvv0x366dnh4drr10wzqmrhcd0kvwglqawgm";
};
Cappeller = pkgs.fetchzip {
url = "${repo}/sa-head/german-entries/tars/capeller-sanskrit-german__2021-10-05_14-23-18Z__1MB.tar.gz";
sha256 = "0jwrj2aih2lrcjg0lqm8jrvq9vsas9s8j4c9ggbg2n0jyz03kci3";
stripRoot = false;
};
Yates = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/yates__2021-10-05_14-23-18Z__2MB.tar.gz";
sha256 = "1k7gbalysf48pwa06zfykrqhdk466g35xy64b30k4z8bybgdn8z2";
stripRoot = false;
};
Wilson = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/wilson__2021-10-05_14-23-18Z__3MB.tar.gz";
sha256 = "0r5z1xif56zlw9r2jp3fvwmcjv4f2fhd9r17j30nah9awx2m1isg";
stripRoot = false;
};
SpokenSanskrit = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/spokensanskrit__2019-01-12_05-13-52Z__12MB.tar.gz";
sha256 = "0x8j657mawvdcyd1knzvf33yp15z77d661n3h6g9hcj7wn9s5xyk";
stripRoot = false;
};
Grassmann = pkgs.fetchzip {
url = "${repo}/sa-head/german-entries/tars/grassman-sanskrit-german__2021-10-05_14-23-18Z__2MB.tar.gz";
sha256 = "0jalsykaxkl6wzrky72lz8g3jdz26lmjpyibbfaf7a5vvnr55k02";
stripRoot = false;
};
Benfey = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/benfey__2021-10-05_14-23-18Z__2MB.tar.gz";
sha256 = "0lj3hgphqgnihn482g9kgjwbvdrcd38vc29v1fi36srn08qdhvcb";
stripRoot = false;
};
ApteSa = pkgs.fetchzip {
url = "${repo}/sa-head/en-entries/tars/apte-sa__2021-12-18_13-20-56Z__6MB.tar.gz";
sha256 = "0cq1dd02d1pvmjnibbs2cscifjnk2z0nqccf5yzzilxkzsrarh32";
stripRoot = false;
};
MacDonell = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/macdonell__2021-10-05_14-23-18Z__2MB.tar.gz";
sha256 = "1yzmj0393mxvjv4n2lnvd2c722v2bmxxiyq7pscdwni3bxip3h8s";
stripRoot = false;
};
*/

View File

@@ -0,0 +1,55 @@
{ pkgs, lib, ... }:
let
nixpkgs-unstable = import <nixpkgs-unstable> {};
toSymbols = pkgs.writers.writeDash "to-symbols" ''
${pkgs.gnused}/bin/sed '
s/\bTri\b//;
s/\bOpp\b//;
s/\bSqu\b//;
s/\bSex\b//;
s/\bCon\b//;
s/Sun//g;
s/Moon//g;
s/Mercury//g;
s/Venus//g;
s/Mars//g;
s/Jupiter//g;
s/Saturn//g;
s/Uranus//g;
s/Neptune//g;
s/Pluto//g;
s/North Node//g;
s/\bLeo\b//g;
s/\bCan\(cer\)\?\b//g;
s/\bGem\(ini\)\?\b//g;
s/\bVir\(go\)\?\b//g;
s/\bLib\(ra\)\?\b//g;
s/\bTau\(rus\)\?\b//g;
s/\bAri\(es\)\?\b//g;
s/\bSco\(rpio\)\?\b//g;
s/\bPis\(ces\)\?\b//g;
s/\bSag\(ittarius\)\?\b//g;
s/\bAqu\(arius\)\?\b//g;
s/\bCap\(ricorn\)\?\b//g;
s/-->//g;
s/\s\+/ /g; # replace multiple spaces by one
s/^.*\([ 0-9]\{2\}:[0-9]\{2\}\) /\1 /; # remove date at beginning of line (but not everything up to v/c X:XX)
s/^\s*//
'
'';
in {
niveum.telegramBots.transits = {
enable = true;
time = "*:0/1";
token = lib.strings.fileContents <system-secrets/telegram/kmein.token>;
chatIds = [ "-1001796440545" ];
command = toString (pkgs.writers.writeDash "common-transits" ''
now=$(${pkgs.coreutils}/bin/date +%_H:%M | ${pkgs.gnused}/bin/sed 's/^\s*//')
date=$(${pkgs.coreutils}/bin/date +'%m %d %Y')
{
${nixpkgs-unstable.astrolog}/bin/astrolog -qd $date -zN Berlin -Yt -Yd -d -R Uranus Neptune Pluto "North Node"
${nixpkgs-unstable.astrolog}/bin/astrolog -Yt -Yd -q 10 22 1999 6:32 -zN Kassel -td $date -R Uranus Neptune Pluto "North Node"
} | ${toSymbols} | ${pkgs.coreutils}/bin/sort -n | ${pkgs.gnugrep}/bin/grep "^$now" || :
'');
};
}

View File

@@ -1,19 +1,13 @@
{ config, pkgs, lib, ... }:
let
telebots = let
telebots-package = pkgs.fetchFromGitHub {
owner = "kmein";
repo = "telebots";
rev = "22931c9457e092c4e413555dbe61819d77844246";
sha256 = "0byp3w6li3fin7ry0ki4rmgkaajdil424y5pc1j7ci9mpws0s5ik";
};
in pkgs.callPackage telebots-package {};
telebots = pkgs.callPackage <telebots> {};
reverseDirectory = "/run/telegram-reverse";
proverbDirectory = "/run/telegram-proverb";
inherit (import <niveum/lib>) tmpfilesConfig;
in {
imports = [
./literature-quote.nix
./astrology.nix
./autorenkalender.nix
./nachtischsatan.nix
./tlg-wotd.nix

View File

@@ -29,7 +29,7 @@ in
bedroom = 131082;
living-room = living-room-id;
bedside = 131087;
desk = 131089;
chain = 131089;
};
};
}

View File

@@ -1,4 +0,0 @@
{ lib, config, ... }:
{
environment.etc."niveum/version".text = lib.sources.commitIdFromGitRepo <niveum/.git>;
}

View File

@@ -1,4 +1,6 @@
{ config, pkgs, ... }:
{
environment.systemPackages = [ pkgs.watson ];
environment.variables.WATSON_DIR = "${config.users.users.me.home}/cloud/Seafile/Documents/watson";
}

View File

@@ -1,114 +0,0 @@
{ lib, pkgs, ... }:
let
inherit (import <niveum/lib>) kieran;
relayPassword = lib.fileContents <system-secrets/weechat/relay>;
in {
systemd.services.weechat =
let
tmux = pkgs.writers.writeDash "tmux" ''
exec ${pkgs.tmux}/bin/tmux -f ${pkgs.writeText "tmux.conf" ''
set-option -g prefix `
unbind-key C-b
bind ` send-prefix
set-option -g status off
set-option -g default-terminal screen-256color
#use session instead of windows
bind-key c new-session
bind-key p switch-client -p
bind-key n switch-client -n
bind-key C-s switch-client -l
''} "$@"
'';
weechat = pkgs.weechat.override {
configure = { ... }: {
scripts = [ pkgs.weechatScripts.weechat-autosort pkgs.weechatScripts.colorize_nicks ];
init = let
coolColors = lib.lists.subtractLists (lib.range 52 69 ++ lib.range 231 248) (lib.range 31 254);
nick = "kmein";
in ''
/mouse enable
/set irc.server_default.nicks "${nick}"
/set irc.server_default.msg_part "tschö mit ö"
/set irc.server_default.msg_quit "ciao kakao"
/set irc.server_default.msg_kick "warum machst du diese?"
/set irc.server_default.realname "${kieran.name}"
/set irc.look.color_nicks_in_nicklist "on"
/set weechat.color.chat_nick_colors "${lib.concatMapStringsSep "," toString coolColors}"
/server add hackint irc.hackint.org/6697 -ipv6 -ssl
/server add libera irc.libera.chat/6697 -ssl
/server add oftc irc.oftc.net/6697 -ssl -ipv6
/server add retiolum irc.r
/server add news news.r
/alias add mod /quote omode $channel +o $nick
/relay add weechat 9000
/set relay.network.password ${relayPassword}
/set irc.server.oftc.command /msg nickserv IDENTIFY ${lib.strings.fileContents <system-secrets/irc/oftc>};/msg nickserv SET CLOAK ON
/set irc.server.oftc.autojoin "#osm,#osm-de,#home-manager"
/set irc.server.hackint.autojoin "#krebs,#nixos,#the_playlist"
/set irc.server.hackint.sasl_mechanism plain
/set irc.server.hackint.sasl_username ${nick}
/set irc.server.hackint.sasl_password ${lib.strings.fileContents <system-secrets/irc/hackint>}
/set irc.server.libera.autojoin "#flipdot,#haskell,#nixos,#fysi,#binaergewitter"
/set irc.server.libera.sasl_mechanism plain
/set irc.server.libera.sasl_username ${nick}
/set irc.server.libera.sasl_password ${lib.strings.fileContents <system-secrets/irc/libera>}
/set irc.server.retiolum.autojoin "#xxx,#brockman,#flix,#autowifi"
/set irc.server.retiolum.command "/oper aids balls"
/set irc.server.news.autojoin "#cook,#drachengame,#oepnv,#kmeinung,#memes"
/set irc.server.news.command "/oper aids balls"
/set logger.level.irc.news 0
/filter addreplace zerocovid * * [kc]orona|💉|🤒|😷|[kc]ovid|virus|lockdown|va[kc][sc]in|mutante|mutation|impf|pandemi|κορ[ωο]ν[αο]ϊό|корона|expert|infe[ck]t|infizi|in[cz]iden[cz]|sars-cov|drosten|virolog|lauterbach|delta|omi[ck]ron
/filter addreplace joinquit * irc_join,irc_part,irc_quit,irc_nick *
/filter addreplace playlist_topic irc.*.#the_playlist irc_topic *
/filter addreplace brockman_notice irc.news.* irc_notice *
/set irc.look.server_buffer independent
/connect libera
/connect oftc
/connect hackint
/connect retiolum
/connect news
'';
};
};
in {
description = "Weechat bouncer";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
restartIfChanged = true;
path = [ pkgs.alacritty.terminfo ];
environment.WEECHAT_HOME = "/var/lib/weechat";
script = "${tmux} -2 new-session -d -s IM ${weechat}/bin/weechat";
preStop = "${tmux} kill-session -t IM";
serviceConfig = {
User = "weechat";
RemainAfterExit = true;
Type = "oneshot";
};
};
users.groups.weechat = {};
users.extraUsers.weechat = {
useDefaultShell = true;
openssh.authorizedKeys.keys = kieran.sshKeys pkgs ++ [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC+KVDmYYH7mA8v81e9O3swXm3ZVYY9t4HP65ud61uXy weechat_android@heym"
];
createHome = true;
group = "weechat";
home = "/var/lib/weechat";
isSystemUser = true;
packages = [ pkgs.tmux ];
};
}

View File

@@ -1,67 +0,0 @@
let
inherit (import ./lib/default.nix) sshPort;
gitFromJson = path:
let object = importJson path;
in {
inherit (object) url;
ref = object.rev;
};
krops = builtins.fetchGit (gitFromJson .versions/krops.json);
lib = import "${krops}/lib";
pkgs = import "${krops}/pkgs" { };
importJson = (import <nixpkgs> { }).lib.importJSON;
regularSystem = { path, name, address }: {
source = lib.evalSource [{
niveum.file = toString ./.;
system.file = toString path;
nixos-config.symlink = "system/configuration.nix";
nixpkgs.git = gitFromJson .versions/nixpkgs.json // { shallow = true; };
nixpkgs-unstable.git = gitFromJson .versions/nixpkgs-unstable.json // { shallow = true; };
home-manager.git = gitFromJson .versions/home-manager.json;
stockholm.git = gitFromJson .versions/stockholm.json;
retiolum.git = gitFromJson .versions/retiolum.json;
nixpkgs-mozilla.git = gitFromJson .versions/nixpkgs-mozilla.json;
system-secrets.pass = {
dir = toString ~/.password-store;
name = "systems/${name}";
};
secrets.pass = {
dir = toString ~/.password-store;
name = "shared";
};
}];
target = "root@${address}:${toString sshPort}";
};
inherit (pkgs.krops) writeDeploy;
in {
zaatar = writeDeploy "deploy-zaatar" (regularSystem {
path = systems/zaatar;
name = "zaatar";
address = "zaatar.r";
});
kabsa = writeDeploy "deploy-kabsa" (regularSystem {
path = systems/kabsa;
name = "kabsa";
address = "kabsa.r";
});
toum = writeDeploy "deploy-toum" (regularSystem {
path = systems/toum;
name = "toum";
address = "toum.r";
}) // {
buildTarget = "${builtins.getEnv "USER"}@localhost/${builtins.getEnv "HOME"}/.cache/krops";
};
makanek = writeDeploy "deploy-makanek" (regularSystem {
path = systems/makanek;
name = "makanek";
address = "makanek.r";
});
manakish = writeDeploy "deploy-manakish" (regularSystem {
path = systems/manakish;
name = "manakish";
address = "manakish.r";
});
}

293
flake.lock generated Normal file
View File

@@ -0,0 +1,293 @@
{
"nodes": {
"flake-utils": {
"locked": {
"lastModified": 1644229661,
"narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"home-manager": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1643933536,
"narHash": "sha256-yRmsWAG4DnLxLIUtlaZsl0kH7rN5xSoyNRlf0YZrcH4=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "2860d7e3bb350f18f7477858f3513f9798896831",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "release-21.11",
"repo": "home-manager",
"type": "github"
}
},
"krops": {
"inputs": {
"flake-utils": [
"flake-utils"
],
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1644957911,
"narHash": "sha256-ggie/j7pdBqzDs4W7OiPmhqH9IGbXAbJxGqBdVxA8jA=",
"owner": "Mic92",
"repo": "krops",
"rev": "86fb3d2ee94fd8306231853b323ed8804edf26ec",
"type": "github"
},
"original": {
"owner": "Mic92",
"repo": "krops",
"type": "github"
}
},
"menstruation-backend": {
"flake": false,
"locked": {
"lastModified": 1634573652,
"narHash": "sha256-FIj8oCOJO+Wqxr2o5MMqIShvzMJud4iUq3o8y4NIRvw=",
"owner": "kmein",
"repo": "menstruation.rs",
"rev": "dd405fe2acf32441e8ac56e488e689bb1c4bea82",
"type": "github"
},
"original": {
"owner": "kmein",
"repo": "menstruation.rs",
"type": "github"
}
},
"menstruation-telegram": {
"flake": false,
"locked": {
"lastModified": 1634815642,
"narHash": "sha256-q1OTMx5ayNu9ppHJBDUie/ow+BcA5DXnHEm11EY+C4E=",
"owner": "kmein",
"repo": "menstruation-telegram",
"rev": "a34555cf46f02157718b0565b5456348fff54181",
"type": "github"
},
"original": {
"owner": "kmein",
"repo": "menstruation-telegram",
"type": "github"
}
},
"nix-writers": {
"flake": false,
"locked": {
"lastModified": 1554228333,
"narHash": "sha256-hG/PlcCvCQhNcU55NpHfATkyH9k6cZmO7uvBoJjasXU=",
"ref": "master",
"rev": "c528cf970e292790b414b4c1c8c8e9d7e73b2a71",
"revCount": 32,
"type": "git",
"url": "https://cgit.krebsco.de/nix-writers"
},
"original": {
"type": "git",
"url": "https://cgit.krebsco.de/nix-writers"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1644837400,
"narHash": "sha256-treFS89w/xKzeTjJSJdYp/Ceddv6oqq7bL9mZMQDPi0=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "a03ae0e6d078cfdbb8404c3bff3622bd4e2f1c57",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-21.11",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1644951967,
"narHash": "sha256-j+l8bt++dsYTJSGABuqeBEom5aNpD4n0BsOTdewFYuU=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "05e1f8a2c7797b0d9f9e07ab2aaeccecdcf9b7da",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "master",
"repo": "nixpkgs",
"type": "github"
}
},
"recht": {
"flake": false,
"locked": {
"lastModified": 1619583518,
"narHash": "sha256-3eFw6xWue9cvPxXq1ROq32ecvPOmqOedgQhyOr7N9iE=",
"owner": "kmein",
"repo": "recht",
"rev": "d551afed23122bb3106e59eb2274394ec5555048",
"type": "github"
},
"original": {
"owner": "kmein",
"repo": "recht",
"type": "github"
}
},
"retiolum": {
"flake": false,
"locked": {
"lastModified": 1644849126,
"narHash": "sha256-iaRNvfQrUD+ZownDWWNdDwhVPgSsU5ojvVdswVq1IpY=",
"owner": "krebs",
"repo": "retiolum",
"rev": "6de359ef848dc1f38fb76731c35e712ee885fd88",
"type": "github"
},
"original": {
"owner": "krebs",
"repo": "retiolum",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"home-manager": "home-manager",
"krops": "krops",
"menstruation-backend": "menstruation-backend",
"menstruation-telegram": "menstruation-telegram",
"nix-writers": "nix-writers",
"nixpkgs": "nixpkgs",
"nixpkgs-unstable": "nixpkgs-unstable",
"recht": "recht",
"retiolum": "retiolum",
"scripts": "scripts",
"stockholm": "stockholm",
"telebots": "telebots",
"tinc-graph": "tinc-graph",
"traadfri": "traadfri",
"tuna": "tuna"
}
},
"scripts": {
"flake": false,
"locked": {
"lastModified": 1639436812,
"narHash": "sha256-6CajvfDo7t4ANgjc7DxqH7lI3WRE4MK8q3mBKAjk80k=",
"owner": "kmein",
"repo": "scripts",
"rev": "d34a8161ba11135a45d3141dc9af482db945d63c",
"type": "github"
},
"original": {
"owner": "kmein",
"repo": "scripts",
"type": "github"
}
},
"stockholm": {
"flake": false,
"locked": {
"lastModified": 1644865613,
"narHash": "sha256-z7hPtMYxoQuWyLujUs5vbdZOGbjFosh+/IX3GpCDlkc=",
"ref": "master",
"rev": "e3785b22b2c6cb173a58fd066c4eda80a67fb872",
"revCount": 10404,
"type": "git",
"url": "https://cgit.lassul.us/stockholm"
},
"original": {
"type": "git",
"url": "https://cgit.lassul.us/stockholm"
}
},
"telebots": {
"flake": false,
"locked": {
"lastModified": 1623510321,
"narHash": "sha256-MxYNNL81RXZkYLd4IgiNTSo1X80kTuDzsdGNSA0f1y8=",
"owner": "kmein",
"repo": "telebots",
"rev": "22931c9457e092c4e413555dbe61819d77844246",
"type": "github"
},
"original": {
"owner": "kmein",
"repo": "telebots",
"type": "github"
}
},
"tinc-graph": {
"flake": false,
"locked": {
"lastModified": 1639820904,
"narHash": "sha256-d4s2PulBGIIQXtX7blZz+Wnmij5dK/IrBcilNGjqZC4=",
"owner": "kmein",
"repo": "tinc-graph",
"rev": "1b9c69ffdbdab82d30a23e44f739feea63d94163",
"type": "github"
},
"original": {
"owner": "kmein",
"repo": "tinc-graph",
"type": "github"
}
},
"traadfri": {
"flake": false,
"locked": {
"lastModified": 1640451803,
"narHash": "sha256-zS/b93uFpPM9basNP7ngmm+YjYV0IUQAmNghetHA6Ss=",
"owner": "kmein",
"repo": "traadfri",
"rev": "cf46bd09cd3263b90a09b0ca979aa705a4c3671c",
"type": "github"
},
"original": {
"owner": "kmein",
"repo": "traadfri",
"type": "github"
}
},
"tuna": {
"flake": false,
"locked": {
"lastModified": 1627117248,
"narHash": "sha256-OfqbWLblJY4BJlrCpn8EkHoP3baNJSDTbw45SPaX+0Q=",
"owner": "kmein",
"repo": "tuna",
"rev": "1cbed44069a3009738afdafecefe0a05316039a6",
"type": "github"
},
"original": {
"owner": "kmein",
"repo": "tuna",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

92
flake.nix Normal file
View File

@@ -0,0 +1,92 @@
{
description = "niveum: packages, modules, systems";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-21.11";
nixpkgs-unstable.url = "github:NixOS/nixpkgs/master";
flake-utils.url = "github:numtide/flake-utils";
home-manager = {
url = "github:nix-community/home-manager/release-21.11";
inputs.nixpkgs.follows = "nixpkgs";
};
krops = {
url = "github:Mic92/krops";
inputs.nixpkgs.follows = "nixpkgs";
inputs.flake-utils.follows = "flake-utils";
};
# legacy
menstruation-backend = { url = "github:kmein/menstruation.rs"; flake = false; };
menstruation-telegram = { url = "github:kmein/menstruation-telegram"; flake = false; };
nix-writers = { url = "git+https://cgit.krebsco.de/nix-writers"; flake = false; };
recht = { url = "github:kmein/recht"; flake = false; };
retiolum = { url = "github:krebs/retiolum"; flake = false; };
scripts = { url = "github:kmein/scripts"; flake = false; };
stockholm = { url = "git+https://cgit.lassul.us/stockholm"; flake = false; };
telebots = { url = "github:kmein/telebots"; flake = false; };
tinc-graph = { url = "github:kmein/tinc-graph"; flake = false; };
traadfri = { url = "github:kmein/traadfri"; flake = false; };
tuna = { url = "github:kmein/tuna"; flake = false; };
};
outputs =
{ self
, flake-utils
, home-manager
, krops
, menstruation-backend
, menstruation-telegram
, nix-writers
, nixpkgs
, nixpkgs-unstable
, recht
, retiolum
, scripts
, stockholm
, telebots
, tinc-graph
, traadfri
, tuna
}@inputs:
let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
source = name: {
niveum.file = toString ./.;
nixos-config.symlink = "niveum/systems/${name}/configuration.nix";
system-secrets.pass = {
dir = toString ~/.password-store;
name = "systems/${name}";
};
secrets.pass = {
dir = toString ~/.password-store;
name = "shared";
};
} // nixpkgs.lib.mapAttrs' (name: value: {
inherit name;
value.file = toString value;
}) (nixpkgs.lib.filterAttrs (name: _: !builtins.elem name [ "flake-utils" "krops" "self" ]) inputs);
deployScriptFor = {name, host}: let inherit (import ./lib/default.nix) sshPort; in toString (krops.packages.${system}.writeDeploy "deploy-${name}" {
source = krops.lib.evalSource [ (source name) ];
target = "root@${host}:${toString sshPort}";
});
in {
apps.${system} = let
forSystems = f: builtins.listToAttrs (map f (builtins.attrNames (builtins.readDir ./systems)));
deployScripts = forSystems (name: {
name = "deploy-${name}";
value = {
type = "app";
program = deployScriptFor { inherit name; host = "${name}.r"; };
};
});
ciScripts = forSystems (name: {
name = "build-${name}";
value = {
type = "app";
program = import ./ci.nix { inherit name system inputs; };
};
});
in deployScripts // ciScripts;
};
}

37
lib/colours/ibm-3270.nix Normal file
View File

@@ -0,0 +1,37 @@
rec {
black = {
bright = "#888888";
dark = "#222222";
};
red = {
bright = "#ef8383";
dark = "#f01818";
};
yellow = {
bright = "#efe28b";
dark = "#f8d824";
};
green = {
bright = "#23d830";
dark = "#7ed684";
};
blue = {
bright = "#b3bfef";
dark = "#7890f0";
};
magenta = {
bright = "#efb3e3";
dark = "#f078d8";
};
cyan = {
bright = "#9ce2e2";
dark = "#54e4e4";
};
white = {
bright = "#ffffff";
dark = "#a5a5a5";
};
background = "#000000";
foreground = "#bbbbbb";
cursor = green.bright;
}

View File

@@ -1,6 +1,12 @@
rec {
tmpfilesConfig = {type, path, mode ? "-", user ? "-", group ? "-", age ? "-", argument ? "-"}: "${type} '${path}' ${mode} ${user} ${group} ${age} ${argument}";
restic = rec {
port = 3571;
host = "zaatar.r";
repository = "rest:http://${host}:${toString port}/";
};
firewall = lib: {
accept = { source, protocol, dport }: "nixos-fw -s ${lib.escapeShellArg source} -p ${lib.escapeShellArg protocol} --dport ${lib.escapeShellArg (toString dport)} -j nixos-fw-accept";
addRules = lib.concatMapStringsSep "\n" (rule: "iptables -A ${rule}");
@@ -15,7 +21,7 @@ rec {
sshPort = 22022;
colours = import ./colours/mac-os.nix;
colours = import ./colours/ibm-3270.nix;
theme = pkgs: {
gtk = {

179
lib/goldendict-config.nix Normal file
View File

@@ -0,0 +1,179 @@
{pkgs, path}: ''
<config>
<paths>
<path recursive="1">${path}</path>
</paths>
<sounddirs/>
<dictionaryOrder name="" id="0">
<mutedDictionaries/>
</dictionaryOrder>
<inactiveDictionaries name="" id="0">
<mutedDictionaries/>
</inactiveDictionaries>
<groups nextId="1"/>
<hunspell dictionariesPath=""/>
<transliteration>
<enableRussianTransliteration>0</enableRussianTransliteration>
<enableGermanTransliteration>0</enableGermanTransliteration>
<enableGreekTransliteration>0</enableGreekTransliteration>
<enableBelarusianTransliteration>0</enableBelarusianTransliteration>
<chinese>
<enable>0</enable>
<enableSCToTWConversion>1</enableSCToTWConversion>
<enableSCToHKConversion>1</enableSCToHKConversion>
<enableTCToSCConversion>1</enableTCToSCConversion>
</chinese>
<romaji>
<enable>0</enable>
<enableHepburn>1</enableHepburn>
<enableNihonShiki>0</enableNihonShiki>
<enableKunreiShiki>0</enableKunreiShiki>
<enableHiragana>1</enableHiragana>
<enableKatakana>1</enableKatakana>
</romaji>
</transliteration>
<forvo>
<enable>0</enable>
<apiKey></apiKey>
<languageCodes></languageCodes>
</forvo>
<mediawikis>
<mediawiki enabled="0" name="English Wikipedia" icon="" id="ae6f89aac7151829681b85f035d54e48" url="https://en.wikipedia.org/w"/>
<mediawiki enabled="0" name="English Wiktionary" icon="" id="affcf9678e7bfe701c9b071f97eccba3" url="https://en.wiktionary.org/w"/>
<mediawiki enabled="0" name="German Wikipedia" icon="" id="a8a66331a1242ca2aeb0b4aed361c41d" url="https://de.wikipedia.org/w"/>
<mediawiki enabled="0" name="German Wiktionary" icon="" id="21c64bca5ec10ba17ff19f3066bc962a" url="https://de.wiktionary.org/w"/>
</mediawikis>
<websites>
<website enabled="0" name="Google En-En (Oxford)" icon="" id="b88cb2898e634c6638df618528284c2d" url="https://www.google.com/search?q=define:%GDWORD%&amp;hl=en" inside_iframe="1"/>
<website enabled="0" name="Urban Dictionary" icon="" id="f376365a0de651fd7505e7e5e683aa45" url="https://www.urbandictionary.com/define.php?term=%GDWORD%" inside_iframe="1"/>
<website enabled="0" name="Multitran (En)" icon="" id="324ca0306187df7511b26d3847f4b07c" url="https://multitran.ru/c/m.exe?CL=1&amp;l1=1&amp;s=%GD1251%" inside_iframe="1"/>
<website enabled="0" name="Lingvo (En-Ru)" icon="" id="924db471b105299c82892067c0f10787" url="http://lingvopro.abbyyonline.com/en/Search/en-ru/%GDWORD%" inside_iframe="1"/>
<website enabled="0" name="Michaelis (Pt-En)" icon="" id="087a6d65615fb047f4c80eef0a9465db" url="http://michaelis.uol.com.br/moderno/ingles/index.php?lingua=portugues-ingles&amp;palavra=%GDISO1%" inside_iframe="1"/>
</websites>
<dictservers/>
<programs>
<program enabled="0" name="Espeak" icon="" id="2cf8b3a60f27e1ac812de0b57c148340" commandLine="${pkgs.espeak}/bin/espeak %GDWORD%" type="0"/>
<program enabled="0" name="Manpages" icon="" id="4f898f7582596cea518c6b0bfdceb8b3" commandLine="${pkgs.man_db}/bin/man -a --html=/bin/cat %GDWORD%" type="2"/>
</programs>
<voiceEngines/>
<mutedDictionaries/>
<popupMutedDictionaries>
<mutedDictionary>ae6f89aac7151829681b85f035d54e48</mutedDictionary>
</popupMutedDictionaries>
<preferences>
<interfaceLanguage></interfaceLanguage>
<helpLanguage></helpLanguage>
<displayStyle>modern</displayStyle>
<newTabsOpenAfterCurrentOne>0</newTabsOpenAfterCurrentOne>
<newTabsOpenInBackground>1</newTabsOpenInBackground>
<hideSingleTab>0</hideSingleTab>
<mruTabOrder>0</mruTabOrder>
<hideMenubar>0</hideMenubar>
<enableTrayIcon>1</enableTrayIcon>
<startToTray>1</startToTray>
<closeToTray>1</closeToTray>
<autoStart>0</autoStart>
<doubleClickTranslates>1</doubleClickTranslates>
<selectWordBySingleClick>0</selectWordBySingleClick>
<escKeyHidesMainWindow>0</escKeyHidesMainWindow>
<zoomFactor>1</zoomFactor>
<helpZoomFactor>1</helpZoomFactor>
<wordsZoomLevel>0</wordsZoomLevel>
<enableMainWindowHotkey>1</enableMainWindowHotkey>
<mainWindowHotkey>Ctrl+F11, Ctrl+F11</mainWindowHotkey>
<enableClipboardHotkey>1</enableClipboardHotkey>
<clipboardHotkey>Ctrl+C, Ctrl+C</clipboardHotkey>
<enableScanPopup>1</enableScanPopup>
<startWithScanPopupOn>0</startWithScanPopupOn>
<enableScanPopupModifiers>0</enableScanPopupModifiers>
<scanPopupModifiers>0</scanPopupModifiers>
<scanPopupAltMode>0</scanPopupAltMode>
<scanPopupAltModeSecs>3</scanPopupAltModeSecs>
<ignoreOwnClipboardChanges>0</ignoreOwnClipboardChanges>
<scanToMainWindow>0</scanToMainWindow>
<ignoreDiacritics>0</ignoreDiacritics>
<showScanFlag>0</showScanFlag>
<scanPopupUseUIAutomation>1</scanPopupUseUIAutomation>
<scanPopupUseIAccessibleEx>1</scanPopupUseIAccessibleEx>
<scanPopupUseGDMessage>1</scanPopupUseGDMessage>
<scanPopupUnpinnedWindowFlags>0</scanPopupUnpinnedWindowFlags>
<scanPopupUnpinnedBypassWMHint>0</scanPopupUnpinnedBypassWMHint>
<pronounceOnLoadMain>0</pronounceOnLoadMain>
<pronounceOnLoadPopup>0</pronounceOnLoadPopup>
<useInternalPlayer>1</useInternalPlayer>
<internalPlayerBackend>FFmpeg+libao</internalPlayerBackend>
<audioPlaybackProgram>mplayer</audioPlaybackProgram>
<alwaysOnTop>1</alwaysOnTop>
<searchInDock>1</searchInDock>
<historyStoreInterval>0</historyStoreInterval>
<favoritesStoreInterval>0</favoritesStoreInterval>
<confirmFavoritesDeletion>1</confirmFavoritesDeletion>
<proxyserver enabled="0" useSystemProxy="0">
<type>0</type>
<host></host>
<port>3128</port>
<user></user>
<password></password>
<systemProxyUser></systemProxyUser>
<systemProxyPassword></systemProxyPassword>
</proxyserver>
<disallowContentFromOtherSites>0</disallowContentFromOtherSites>
<enableWebPlugins>0</enableWebPlugins>
<hideGoldenDictHeader>0</hideGoldenDictHeader>
<maxNetworkCacheSize>50</maxNetworkCacheSize>
<clearNetworkCacheOnExit>1</clearNetworkCacheOnExit>
<maxStringsInHistory>500</maxStringsInHistory>
<storeHistory>1</storeHistory>
<alwaysExpandOptionalParts>0</alwaysExpandOptionalParts>
<addonStyle></addonStyle>
<collapseBigArticles>0</collapseBigArticles>
<articleSizeLimit>2000</articleSizeLimit>
<limitInputPhraseLength>0</limitInputPhraseLength>
<inputPhraseLengthLimit>1000</inputPhraseLengthLimit>
<maxDictionaryRefsInContextMenu>20</maxDictionaryRefsInContextMenu>
<trackClipboardChanges>0</trackClipboardChanges>
<synonymSearchEnabled>1</synonymSearchEnabled>
<fullTextSearch>
<searchMode>0</searchMode>
<matchCase>0</matchCase>
<maxArticlesPerDictionary>100</maxArticlesPerDictionary>
<maxDistanceBetweenWords>2</maxDistanceBetweenWords>
<useMaxArticlesPerDictionary>0</useMaxArticlesPerDictionary>
<useMaxDistanceBetweenWords>1</useMaxDistanceBetweenWords>
<dialogGeometry></dialogGeometry>
<disabledTypes></disabledTypes>
<enabled>1</enabled>
<ignoreWordsOrder>0</ignoreWordsOrder>
<ignoreDiacritics>0</ignoreDiacritics>
<maxDictionarySize>0</maxDictionarySize>
</fullTextSearch>
</preferences>
<lastMainGroupId>0</lastMainGroupId>
<lastPopupGroupId>0</lastPopupGroupId>
<popupWindowState>AAAA/wAAAAH9AAAAAAAAAg0AAAGTAAAABAAAAAQAAAAIAAAACPwAAAABAAAAAQAAAAEAAAAaAGQAaQBjAHQAaQBvAG4AYQByAHkAQgBhAHIDAAAAAP////8AAAAAAAAAAA==</popupWindowState>
<popupWindowGeometry>AdnQywADAAAAAAC6AAABEgAAAuYAAAKkAAAAugAAARIAAALmAAACpAAAAAAAAAAABVYAAAC6AAABEgAAAuYAAAKk</popupWindowGeometry>
<pinPopupWindow>0</pinPopupWindow>
<popupWindowAlwaysOnTop>0</popupWindowAlwaysOnTop>
<mainWindowState>AAAA/wAAAAH9AAAAAgAAAAAAAADMAAAC0PwCAAAAAfsAAAAUAHMAZQBhAHIAYwBoAFAAYQBuAGUBAAAAFAAAAtAAAAB9AP///wAAAAEAAADMAAAC0PwCAAAAA/sAAAASAGQAaQBjAHQAcwBQAGEAbgBlAQAAABQAAAFvAAAAYQD////7AAAAGgBmAGEAdgBvAHIAaQB0AGUAcwBQAGEAbgBlAAAAABQAAALQAAAAYQD////7AAAAFgBoAGkAcwB0AG8AcgB5AFAAYQBuAGUBAAABhAAAAWAAAABhAP///wAAA7QAAALQAAAABAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAIAAAAUAG4AYQB2AFQAbwBvAGwAYgBhAHIAAAAAAP////8AAAAAAAAAAAAAABoAZABpAGMAdABpAG8AbgBhAHIAeQBCAGEAcgAAAAAA/////wAAAAAAAAAA</mainWindowState>
<mainWindowGeometry>AdnQywADAAAAAAAEAAAAGAAABVEAAAL7AAAABAAAABgAAAVRAAAC+wAAAAAAAAAABVYAAAAEAAAAGAAABVEAAAL7</mainWindowGeometry>
<helpWindowGeometry>AdnQywADAAAAAAF3AAAAgwAAA9AAAAJGAAABeAAAAIQAAAPPAAACRQAAAAAAAAAABVYAAAF4AAAAhAAAA88AAAJF</helpWindowGeometry>
<helpSplitterState>AAAA/wAAAAEAAAACAAABBAAABAAB/////wEAAAABAA==</helpSplitterState>
<dictInfoGeometry>AdnQywADAAAAAAF1AAAAmgAAA84AAAIrAAABdgAAAJsAAAPNAAACKgAAAAAAAAAABVYAAAF2AAAAmwAAA80AAAIq</dictInfoGeometry>
<inspectorGeometry></inspectorGeometry>
<timeForNewReleaseCheck></timeForNewReleaseCheck>
<skippedRelease></skippedRelease>
<showingDictBarNames>1</showingDictBarNames>
<usingSmallIconsInToolbars>1</usingSmallIconsInToolbars>
<editDictionaryCommandLine></editDictionaryCommandLine>
<maxPictureWidth>0</maxPictureWidth>
<maxHeadwordSize>256</maxHeadwordSize>
<maxHeadwordsToExpand>0</maxHeadwordsToExpand>
<headwordsDialog>
<searchMode>0</searchMode>
<matchCase>0</matchCase>
<autoApply>0</autoApply>
<headwordsExportPath></headwordsExportPath>
<headwordsDialogGeometry></headwordsDialogGeometry>
</headwordsDialog>
</config>
''

View File

@@ -92,11 +92,6 @@ in {
units = "metric";
};
}
{
block = "custom";
interval = 60 * 5;
command = let inherit (import <niveum/configs/spacetime.nix>) location; in "${pkgs.scripts.horoscope}/bin/horoscope --latitude=${toString location.latitude} --longitude=${toString location.longitude}";
}
{
block = "custom";
interval = 60 * 5;
@@ -105,7 +100,6 @@ in {
import astral
import astral.moon
import astral.sun
import math
moon_phases = {
0: "🌑",
@@ -121,38 +115,22 @@ in {
current_phase = astral.moon.phase()
closest_phase = min(moon_phases.keys(), key=lambda x: abs(current_phase - x))
moon_percentage = round(100 * math.sin(current_phase / 28 * math.pi), 1)
city = astral.LocationInfo("Berlin", "Germany", "${spacetime.time.timeZone}", ${toString spacetime.location.latitude}, ${toString spacetime.location.longitude})
sun = astral.sun.sun(city.observer, date=astral.today(), tzinfo=city.timezone)
print("🌅 {} 🌇 {} {} {}%".format(sun["sunrise"].strftime("%R"), sun["sunset"].strftime("%R"), moon_phases[closest_phase], moon_percentage))
print("🌅 {} 🌇 {} {} {}".format(sun["sunrise"].strftime("%R"), sun["sunset"].strftime("%R"), moon_phases[closest_phase], round(current_phase, 1)))
'';
}
{
block = "custom";
interval = 60 * 60;
command = pkgs.writers.writeDash "vax" ''
${pkgs.curl}/bin/curl -sSL https://api.corona-zahlen.org/vaccinations \
| ${pkgs.jq}/bin/jq -r '"💉 \(.data.quote * 1000 | floor | . / 10)% \(.data.secondVaccination.quote * 1000 | floor | . / 10)%"'
interval = 5;
command = pkgs.writers.writeDash "hu-berlin-vpn" ''
PATH=${lib.makeBinPath [ pkgs.systemd ]}
(systemctl is-active --quiet openvpn-hu-berlin.service && echo "🎓👍 (OpenVPN)") \
|| (systemctl is-active --quiet hu-vpn.service && echo "🎓👍 (PPP+SSL)") \
|| echo "🎓👎"
'';
}
(let service = "openvpn-hu-berlin"; in {
block = "custom";
interval = 5;
command = pkgs.writers.writeDash "net-device" ''
PATH=${lib.makeBinPath [ pkgs.systemd ]}
systemctl is-active --quiet ${service}.service && echo "🎓👍" || echo "🎓👎"
'';
on_click = pkgs.writers.writeDash "toggle" ''
PATH=${lib.makeBinPath [ pkgs.systemd pkgs.libnotify ]}
systemctl is-active --quiet ${service}.service && {
systemctl stop ${service}.service && notify-send -a "${service}" stopped
} || {
systemctl start ${service}.service && notify-send -a "${service}" started
}
'';
})
{
block = "net";
device = wirelessInterface;

View File

@@ -6,7 +6,7 @@ let
importJSON = path: builtins.fromJSON (builtins.readFile path);
di-fm-name = name: "${name} | DI.FM";
di-fm = name: "http://prem2.di.fm/${name}_hi?${di-fm-key}";
di-fm = name: "http://prem3.di.fm/${name}_hi?${di-fm-key}";
soma-fm-name = name: "${name} | soma.fm";
soma-fm = name: "http://ice1.somafm.com/${name}-128-aac";
@@ -50,16 +50,26 @@ in [
desc = "Diminutive from lassus (weary, faint, tired). A programming human. Doing superior professional art.";
}
{
stream = "https://radio.kmein.de/lyrik/listen.ogg";
station = "C3 Lounge";
stream = "https://c3lounge.de/radio/8000/radio.mp3";
}
{
stream = "https://radio.kmein.de/lyrik.ogg";
station = "Lyrik";
desc = "Lyrik-Lesung rund um die Uhr.";
}
{
stream = "https://radio.kmein.de/lyrikline/listen.ogg";
stream = "https://radio.kmein.de/lyrikline.ogg";
station = "Lyrikline";
logo = "https://www.lyrikline.org/themes/lyrik/svg/Logo_lyrikline_pure.svg";
desc = "24/7 zufällige Wiedergaben von lyrikline.org.";
}
{
stream = "https://radio.kmein.de/wikipedia.ogg";
station = "Wikipedia";
desc = "Zufällige Wikipedia-Artikel";
logo = "https://de.wikipedia.org/wiki/Wikipedia:Enzyklop%C3%A4die/Logo_von_Wikipedia#/media/Datei:Wikipedia-logo-v2.svg";
}
{
stream = "http://162.244.80.20:6948";
station = "Cool Jazz Florida";
@@ -92,583 +102,491 @@ in [
logo = "http://radio-rb.de/img/site/logo.png";
desc = "Голос нашего города ...";
}
{
stream = "https://drachenhits.stream.laut.fm/drachenhits";
station = "Drachenhits";
}
] ++
# generated via: curl https://radiorecord.ru/api/stations | jq '.result.stations | sort_by(.sort) | map({station:.title,desc:.tooltip,logo:.icon_fill_colored,stream:.stream_320})' > radiorecord.json
importJSON ./radiorecord.json
++ [
{
desc = "Your favorite dance tunes from the start of the decade. Familiar hits and overlooked classics in abundance.";
logo = "http://cdn-images.audioaddict.com/1/4/0/3/5/b/14035b0944a3c2e77852b6d0944f381e.jpg?size=180x180";
station = di-fm-name "00s Club Hits";
stream = di-fm "00sclubhits";
}
{
desc = "Electronic sounds and atmospheric textures create a genre to enhance your state of mind and take you deeper.";
logo = "http://cdn-images.audioaddict.com/a/9/4/6/2/f/a9462ff46233f40fe0aa306379ae7cd8.jpg?size=180x180";
station = di-fm-name "Ambient";
stream = di-fm "ambient";
}
{
desc = "Spaced out, melodic and full of warmth these broken beat dance tunes will keep you dazed and amused.";
logo = "http://cdn-images.audioaddict.com/3/9/7/3/4/3/397343ffcf5543b60bba72f393e1c3c0.jpg?size=180x180";
station = di-fm-name "Atmospheric Breaks";
stream = di-fm "atmosphericbreaks";
}
{
desc = "From the funkiest grooves to the dirtiest beats. Hard-hitting, high energy 4/4 club cuts to move the masses.";
logo = "http://cdn-images.audioaddict.com/4/f/e/d/8/9/4fed8974f4cfbbd0712baa8ae2cc2ed2.jpg?size=180x180";
station = di-fm-name "Bass & Jackin' House";
stream = di-fm "bassnjackinhouse";
}
{
desc = "Blending together elements of house music, speed garage, and techno it's all about the low end frequencies.";
logo = "http://cdn-images.audioaddict.com/9/1/9/9/6/d/91996d1fed5b9607c625069bcb8d3b52.jpg?size=180x180";
station = di-fm-name "Bassline";
stream = di-fm "bassline";
}
{
desc = "Heavily focused on breakbeats and dusty samples. A defining 90s musical movement still going strong today.";
logo = "http://cdn-images.audioaddict.com/6/f/4/3/2/4/6f4324c4a776101fd91008d739ac3020.jpg?size=180x180";
station = di-fm-name "Big Beat";
stream = di-fm "bigbeat";
}
{
desc = "Fusing together house elements from the past and the present prime time music full of uplifting high energy.";
logo = "http://cdn-images.audioaddict.com/0/4/1/2/5/7/0412578b5e31cf1b68f23c3cb5377139.jpg?size=180x180";
station = di-fm-name "Big Room House";
stream = di-fm "bigroomhouse";
}
{
desc = "Inspired by hip hop and UK rave music, breaks features broken up drum loops and creative samples, synths and fx.";
logo = "http://cdn-images.audioaddict.com/2/1/b/1/2/9/21b12909a0618017285f62a5af4b2ce5.jpg?size=180x180";
station = di-fm-name "Breaks";
stream = di-fm "breaks";
}
{
desc = "The sounds of Chill & Tropical House are expertly made for lounging and dancing alike with its deeper house vibes.";
logo = "http://cdn-images.audioaddict.com/2/9/0/1/e/f/2901ef5c923bb0f9ff856ac4007975f0.jpg?size=180x180";
station = di-fm-name "Chill & Tropical House";
stream = di-fm "chillntropicalhouse";
}
{
desc = "Good EDM doesn't have to blow out your speakers and our curated selection of Chill EDM is a testament to the strength of mellow, chilled out electronic music.";
logo = "http://cdn-images.audioaddict.com/f/0/7/5/2/e/f0752e6df86dc7a0f3ffd7a63497df4e.jpg?size=180x180";
station = di-fm-name "Chill EDM";
stream = di-fm "chilledm";
}
{
desc = "Mellow chill beats, lofi hip-hop, trip hop, downtempo beats and jazz, blended together in a laid back style for perfect listening.";
logo = "http://cdn-images.audioaddict.com/f/2/3/8/8/b/f2388be364717a3aa33f62411d9e3585.jpg?size=180x180";
station = di-fm-name "ChillHop";
stream = di-fm "chillhop";
}
{
desc = "Electronic sounds, mellow mid-tempo rhythms, and a groove meant to calm the senses and ease the mind.";
logo = "http://cdn-images.audioaddict.com/f/d/9/6/c/a/fd96ca5c52508a2755a266ebf506f162.jpg?size=180x180";
station = di-fm-name "Chillout";
stream = di-fm "chillout";
}
{
desc = "The perfect musical soundtrack for when you want to close your eyes, get truly comfortable, and drift away.";
logo = "http://cdn-images.audioaddict.com/1/d/4/f/3/3/1d4f3310f94769b4e2f55ee0887eead3.jpg?size=180x180";
station = di-fm-name "Chillout Dreams";
stream = di-fm "chilloutdreams";
}
{
desc = "The brilliant combination of dubstep rhythms with the mellow grooves of chillout. A unique sound all its own.";
logo = "http://cdn-images.audioaddict.com/c/e/9/b/d/1/ce9bd1666b49921b440ec796653b24f0.jpg?size=180x180";
station = di-fm-name "Chillstep";
stream = di-fm "chillstep";
}
{
desc = "European pop music born in the 90s full of high energy sounds and big hooks now heard in gyms and malls worldwide.";
logo = "http://cdn-images.audioaddict.com/a/9/8/1/5/3/a98153e6c9fcee321fd6dff0c8a6d0ba.jpg?size=180x180";
station = di-fm-name "Classic EuroDance";
stream = di-fm "classiceurodance";
}
{
desc = "Conceived in the European discos in the 70s, evolving through the decades into modern electronic masterpieces.";
logo = "http://cdn-images.audioaddict.com/0/1/0/a/6/6/010a6648f8afc52654b07c07c68e9cad.jpg?size=180x180";
station = di-fm-name "Classic EuroDisco";
stream = di-fm "classiceurodisco";
}
{
desc = "The classic melodies, the epic breakdowns and gigantic builds. Re-experience Trance music in her prime.";
logo = "http://cdn-images.audioaddict.com/4/6/8/0/a/3/4680a3fd0e35f0b2f9bf60c9889d4343.jpg?size=180x180";
station = di-fm-name "Classic Trance";
stream = di-fm "classictrance";
}
{
desc = "Classic sounds of Vocal Trance";
logo = "http://cdn-images.audioaddict.com/1/e/1/8/1/a/1e181a502369be86e3f2e696723c26fe.jpg?size=180x180";
station = di-fm-name "Classic Vocal Trance";
stream = di-fm "classicvocaltrance";
}
{
desc = "The bassbin rattling, speaker-freaking hits of Dubstep all tried, tested and approved to work in the clubs.";
logo = "http://cdn-images.audioaddict.com/3/6/b/5/e/7/36b5e73f328251b20120a6bc5365777f.jpg?size=180x180";
station = di-fm-name "Club Dubstep";
stream = di-fm "clubdubstep";
}
{
desc = "The music heard in the biggest venues worldwide. From prime time pushers to deeper house shakers the sounds of now.";
logo = "http://cdn-images.audioaddict.com/2/e/e/f/9/8/2eef98b26e5490acc78ff6ab22e04827.jpg?size=180x180";
station = di-fm-name "Club Sounds";
stream = di-fm "club";
}
{
desc = "From techno, deep house, progressive and trance check out the sounds of the DJ deep in the mix.";
logo = "http://cdn-images.audioaddict.com/1/3/a/a/0/8/13aa08b5dce2525029c6ddfb8e286dc2.jpg?size=180x180";
station = di-fm-name "DJ Mixes";
stream = di-fm "djmixes";
}
{
desc = "Evil, gritty and twisted DnB / Drum & Bass. at 160+ BPM, hear the darkest basslines and the hardest hitting percussion.";
logo = "http://cdn-images.audioaddict.com/6/e/4/7/c/1/6e47c1d85f09957d568c9535dda75e58.jpg?size=180x180";
station = di-fm-name "Dark DnB";
stream = di-fm "darkdnb";
}
{
desc = "The darker form of PsyTrance, which is a sound all its own direct from Goa to your headphones.";
logo = "http://cdn-images.audioaddict.com/0/e/1/0/b/9/0e10b950ca2f3e828becbe3dd3c2d0b3.jpg?size=180x180";
station = di-fm-name "Dark PsyTrance";
stream = di-fm "darkpsytrance";
}
{
desc = "House music crafted for the smaller and mid-sized rooms deeper tracks full of silky, smooth grooves.";
logo = "http://cdn-images.audioaddict.com/9/a/1/b/4/6/9a1b469ae251c084465096038312d506.jpg?size=180x180";
station = di-fm-name "Deep House";
stream = di-fm "deephouse";
}
{
desc = "Elements of house, funk, and disco. Mid-tempo beats, soulful grooves and head nodding selections.";
logo = "http://cdn-images.audioaddict.com/b/2/a/7/1/5/b2a715bb711ab06822bcaf07fde74d51.jpg?size=180x180";
station = di-fm-name "Deep Nu-Disco";
stream = di-fm "deepnudisco";
}
{
desc = "This smooth, groove-heavy selection of deep progressive house tracks is the perfect soundtrack for smaller and mid-sized rooms.";
logo = "http://cdn-images.audioaddict.com/b/0/e/1/9/0/b0e19018c34150a07d76224e5fcdbeda.jpg?size=180x180";
station = di-fm-name "Deep Progressive House";
stream = di-fm "deepprogressivehouse";
}
{
desc = "A fusion of deep house & techno. Punchy grooves, spaced out sounds and forward thinking productions.";
logo = "http://cdn-images.audioaddict.com/d/3/2/1/7/5/d32175a432f823ce84261c01d4b53f57.jpg?size=180x180";
station = di-fm-name "Deep Tech";
stream = di-fm "deeptech";
}
{
desc = "Where would dance music be without Detroit? The city that started it all continues to inspire and educate.";
logo = "http://cdn-images.audioaddict.com/d/7/b/3/1/d/d7b31d5973593af0043fed3f180df702.jpg?size=180x180";
station = di-fm-name "Detroit House & Techno";
stream = di-fm "detroithousentechno";
}
{
desc = "The feel good sound inspired from 70s disco combined with the warm kick drum of modern house music.";
logo = "http://cdn-images.audioaddict.com/2/7/9/7/0/5/279705ae85a4e0f529f6f7fbaa47a646.jpg?size=180x180";
station = di-fm-name "Disco House";
stream = di-fm "discohouse";
}
{
desc = "Head nodding beats, chilled vocals, and lush soundscapes to bring down the sun and start the night.";
logo = "http://cdn-images.audioaddict.com/f/8/3/3/6/f/f8336fff9bcb4b01a36f2684ecd150c6.jpg?size=180x180";
station = di-fm-name "Downtempo Lounge";
stream = di-fm "downtempolounge";
}
{
desc = "Born in the mid 90s, Drum and Bass / DnB is all about fast breakbeats, urban vibes, and rib rattling basslines.";
logo = "http://cdn-images.audioaddict.com/1/9/8/1/3/f/19813f3ba29ad66caa06bbee4aba558a.jpg?size=180x180";
station = di-fm-name "Drum and Bass";
stream = di-fm "drumandbass";
}
{
desc = "A hybrid of half-time Dubstep and intense Drum and Bass / DnB.";
logo = "http://cdn-images.audioaddict.com/1/c/6/0/b/9/1c60b9976b4d861ddc90d668f749fe6f.jpg?size=180x180";
station = di-fm-name "Drumstep";
stream = di-fm "drumstep";
}
{
desc = "An emphasis on the bass and drums / DnB, delayed effects, sampled vocals and smokey Reggae inspired vibes.";
logo = "http://cdn-images.audioaddict.com/e/2/c/8/6/5/e2c865e92c65cfb91ad0e2d3933234e0.jpg?size=180x180";
station = di-fm-name "Dub";
stream = di-fm "dub";
}
{
desc = "The beloved sounds of deep techno saturated with tape delays, heavy reverb and ice cold atmospherics.";
logo = "http://cdn-images.audioaddict.com/1/9/d/6/1/0/19d61084830ef94886b32d847fc5d29e.jpg?size=180x180";
station = di-fm-name "Dub Techno";
stream = di-fm "dubtechno";
}
{
desc = "The wobbles of the bass, the party rocking beats, and the biggest crowd destroying drops.";
logo = "http://cdn-images.audioaddict.com/7/7/c/1/a/e/77c1aec493eeb9e2a5d22951447fbd48.jpg?size=180x180";
station = di-fm-name "Dubstep";
stream = di-fm "dubstep";
}
{
desc = "The sound of the largest events. From the gargantuan festivals, the huge main rooms and the biggest DJs.";
logo = "http://cdn-images.audioaddict.com/d/d/1/1/8/f/dd118f5fe9befc191907a32d0877a13d.jpg?size=180x180";
station = di-fm-name "EDM Festival";
stream = di-fm "edmfestival";
}
{
desc = "Where dance meets pop. Crossover favorites, stadium-sized anthems and the biggest electronic tunes in existence.";
logo = "http://cdn-images.audioaddict.com/6/9/b/2/c/c/69b2cc01d4cbcb5a813ee6428bc4e455.jpg?size=180x180";
station = di-fm-name "EDM Hits";
stream = di-fm "edm";
}
{
desc = "Buzzing basslines, huge kicks, party rocking drops. House music packed full of gigantic bass and massive synths.";
logo = "http://cdn-images.audioaddict.com/7/4/2/3/8/0/742380673147770eef642532828dbc6c.jpg?size=180x180";
station = di-fm-name "Electro House";
stream = di-fm "electrohouse";
}
{
desc = "The combination of 1920s-1940s jazz and swing music, big band horns and modern day electro house.";
logo = "http://cdn-images.audioaddict.com/3/3/e/6/0/9/33e609d64ca20b0719d28d2193eece31.jpg?size=180x180";
station = di-fm-name "Electro Swing";
stream = di-fm "electroswing";
}
{
desc = "The trailblazers, the renegades and the experimental musicians who gave early inspiration with electronic instruments.";
logo = "http://cdn-images.audioaddict.com/5/7/4/a/3/3/574a3373b242bed1018c5c99e5021c3f.jpg?size=180x180";
station = di-fm-name "Electronic Pioneers";
stream = di-fm "electronicpioneers";
}
{
desc = "Catchy pop music blended together with vintage synthesizers and electronic instrumentation.";
logo = "http://cdn-images.audioaddict.com/2/8/c/1/e/8/28c1e8587ae6e0b2589b4d66ccd99324.jpg?size=180x180";
station = di-fm-name "Electropop";
stream = di-fm "electropop";
}
{
desc = "Trance in its most boisterous form. Uplifting melodies on top of high energy beats create these euphoric anthems.";
logo = "http://cdn-images.audioaddict.com/f/1/f/d/f/e/f1fdfea9ba9622ecdee020cc53126e60.jpg?size=180x180";
station = di-fm-name "Epic Trance";
stream = di-fm "epictrance";
}
{
desc = "Pop music infused with a high energy 4/4 pulse. Heavy on the synthesizers, the melodies and the vocals.";
logo = "http://cdn-images.audioaddict.com/4/b/b/2/7/5/4bb2756bcacce0a2bf44ebaaf743f2ab.jpg?size=180x180";
station = di-fm-name "EuroDance";
stream = di-fm "eurodance";
}
{
desc = "Focused on the funkiest grooves, with plenty of the guitar licks and clever samples placed around a 4/4 swing.";
logo = "http://cdn-images.audioaddict.com/3/3/7/0/b/a/3370baa3700e4578558dff57c6443a0f.jpg?size=180x180";
station = di-fm-name "Funky House";
stream = di-fm "funkyhouse";
}
{
desc = "Hard basslines, booming beats and insatiable grooves. Inspired by Trap, Juke and Garage molded together into a unique booming style.";
logo = "http://cdn-images.audioaddict.com/3/9/e/5/8/b/39e58b7b675d6ec353582cd5e9f38dbe.jpg?size=180x180";
station = di-fm-name "Future Bass";
stream = di-fm "futurebass";
}
{
desc = "2step Garage rhythms, chunky bass line driven grooves and plenty of forward thinking innovation.";
logo = "http://cdn-images.audioaddict.com/0/e/9/0/4/2/0e904268ec98b8c0521c30da4ac321bb.jpg?size=180x180";
station = di-fm-name "Future Garage";
stream = di-fm "futuregarage";
}
{
desc = "Finest selection of futurepop and synthpop.";
logo = "http://cdn-images.audioaddict.com/e/e/8/5/2/3/ee8523a0d6165465961cb2d0445c4f27.jpg?size=180x180";
station = di-fm-name "Future Synthpop";
stream = di-fm "futuresynthpop";
}
{
desc = "The hardest form of techno with punishing tracks designed to drive the crowds into a sweaty frenzy.";
logo = "http://cdn-images.audioaddict.com/d/a/f/c/e/d/dafced37829e69724be99dc375bc5713.jpg?size=180x180";
station = di-fm-name "Gabber";
stream = di-fm "gabber";
}
{
desc = "The sound of digital malfunctions, electric hum and bit rate distortions perfectly placed alongside laid-back hip hop beats.";
logo = "http://cdn-images.audioaddict.com/7/3/5/a/b/b/735abb160f950c98e2bd7caf6843e255.jpg?size=180x180";
station = di-fm-name "Glitch Hop";
stream = di-fm "glitchhop";
}
{
desc = "A very psychedelic form of trance, Goa-Psy Trance is a sound full of arpeggiated synths and trippy effects.";
logo = "http://cdn-images.audioaddict.com/4/e/e/e/4/4/4eee448424df2768055ee7503f0251e9.jpg?size=180x180";
station = di-fm-name "Goa-Psy Trance";
stream = di-fm "goapsy";
}
{
desc = "A channel showcasing everything from hard dance, trance and happy hardcore to lift the spirits (and the arms).";
logo = "http://cdn-images.audioaddict.com/d/f/7/7/8/e/df778eed294536f4e858093124aa2be5.jpg?size=180x180";
station = di-fm-name "Hands Up";
stream = di-fm "handsup";
}
{
desc = "Concrete kicks and punching rhythms, hard dance is a tougher side of music with sharp edges and aggressive power.";
logo = "http://cdn-images.audioaddict.com/5/9/d/a/e/5/59dae529a51feb3f90b542f3d33808ec.jpg?size=180x180";
station = di-fm-name "Hard Dance";
stream = di-fm "harddance";
}
{
desc = "Tough as nails warehouse jams full of cold aggression, sinister structures and pounding rhythms that hit hard.";
logo = "http://cdn-images.audioaddict.com/5/e/5/1/1/d/5e511d67198b404149e7eaed9858e5d4.jpg?size=180x180";
station = di-fm-name "Hard Techno";
stream = di-fm "hardtechno";
}
{
desc = "Strictly for the hardcore. These are the biggest and boldest bangers, and the hardest hitting tracks.";
logo = "http://cdn-images.audioaddict.com/e/0/5/3/8/5/e05385cf844ef4884a26c19ed254efbf.jpg?size=180x180";
station = di-fm-name "Hardcore";
stream = di-fm "hardcore";
}
{
desc = "Hard techno & hardcore. A global phenomenon with powerful kicks, distorted effects and infectious melodies.";
logo = "http://cdn-images.audioaddict.com/8/b/1/0/3/c/8b103c03fbf78becf042085552e9ef41.jpg?size=180x180";
station = di-fm-name "Hardstyle";
stream = di-fm "hardstyle";
}
{
desc = "Born in Chicago and now global, house music is always evolving but remains true to its pure 4/4 structure.";
logo = "http://cdn-images.audioaddict.com/5/3/0/b/6/9/530b699645ddff8d66a2333ae09bb06a.jpg?size=180x180";
station = di-fm-name "House";
stream = di-fm "house";
}
{
desc = "Smooth, groovy and full of cutting-edge, fresh ideas beats to kick back and enjoy far from the club setting.";
logo = "http://cdn-images.audioaddict.com/9/1/8/4/2/b/91842b0ec15b8b69e50315dbd3afe03e.jpg?size=180x180";
station = di-fm-name "Indie Beats";
stream = di-fm "indiebeats";
}
{
desc = "The spirit of Rock & Roll with an electronic soul. Club culture and live music combined.";
logo = "http://cdn-images.audioaddict.com/9/f/7/0/a/d/9f70ad76ec13a6123405c6d7a03325f3.jpg?size=180x180";
station = di-fm-name "Indie Dance";
stream = di-fm "indiedance";
}
{
desc = "One of the biggest cultural soundtracks with the infectious thump of house music. Expect sultry saxophones, trumpets, and finger snapping grooves.";
logo = "http://cdn-images.audioaddict.com/f/4/b/3/3/e/f4b33e8cbd9f0b1776e64f17b9c35abd.jpg?size=180x180";
station = di-fm-name "Jazz House";
stream = di-fm "jazzhouse";
}
{
desc = "Jungle keeps the breakbeat tempos high and celebrates the diverse ideas found within urban and rave music.";
logo = "http://cdn-images.audioaddict.com/4/1/e/d/e/7/41ede7b8b43cffcc42876e6e319b7ef3.jpg?size=180x180";
station = di-fm-name "Jungle";
stream = di-fm "jungle";
}
{
desc = "The sounds of Salsa, Brazilian beats and Latin Jazz with the steady grooves of modern East Coast dance music.";
logo = "http://cdn-images.audioaddict.com/6/0/1/7/6/e/60176ec05138ad9b621cb92de7f0c8c8.jpg?size=180x180";
station = di-fm-name "Latin House";
stream = di-fm "latinhouse";
}
{
desc = "Smooth as water, with the fast paced rhythms, Liquid DNB / Drum and Bass flows with rolling ease without losing momentum.";
logo = "http://cdn-images.audioaddict.com/6/7/5/9/9/a/67599a0b4f3575ea5f6a74fe633899d7.jpg?size=180x180";
station = di-fm-name "Liquid DnB";
stream = di-fm "liquiddnb";
}
{
desc = "Smooth, rolling and steady this fresh formation of Dubstep keeps the sounds you love with a flowing Drum and Bass groove.";
logo = "http://cdn-images.audioaddict.com/6/e/f/6/c/e/6ef6ced4249faec61c8fbc58b10b6343.jpg?size=180x180";
station = di-fm-name "Liquid Dubstep";
stream = di-fm "liquiddubstep";
}
{
desc = "The smoother side of Trap but still packed with mechanical grooves and hip hop moods.";
logo = "http://cdn-images.audioaddict.com/6/b/5/b/d/6/6b5bd66a99e46fa1258cb565d988ea7c.jpg?size=180x180";
station = di-fm-name "Liquid Trap";
stream = di-fm "liquidtrap";
}
{
desc = "Tastefully selected LoFi Hip-Hop tunes with textured atmospheres & laid back beats with a dash of chillhop and perfectly designed to chill your ears.";
logo = "http://cdn-images.audioaddict.com/c/f/7/0/d/a/cf70daf883c01687f321d72376227493.jpg?size=180x180";
station = di-fm-name "LoFi Hip-Hop";
stream = di-fm "lofihiphop";
}
{
desc = "Punch your one-way ticket to peace of mind and mental clarity with this curated selection of LoFi Lounge & Chill tracks today.";
logo = "http://cdn-images.audioaddict.com/0/2/7/2/1/f/02721f4098dbeae07a8956d832f59cd8.jpg?size=180x180";
station = di-fm-name "LoFi Lounge & Chill";
stream = di-fm "lofiloungenchill";
}
{
desc = "Music to chill to. Music made for when it's all about kicking off your shoes, laying back, and totally relaxing.";
logo = "http://cdn-images.audioaddict.com/f/7/a/5/f/b/f7a5fbb67a1a0f0992f131506917c2e6.jpg?size=180x180";
station = di-fm-name "Lounge";
stream = di-fm "lounge";
}
{
desc = "The melodic side of progressive house, packed with driving rhythms and forward thinking sounds.";
logo = "http://cdn-images.audioaddict.com/4/4/8/c/f/6/448cf62c2d3c68ede713008015da9bfc.jpg?size=180x180";
station = di-fm-name "Melodic Progressive";
stream = di-fm "melodicprogressive";
}
{
desc = "Minimal fuses elements of house, techno and electronica and strips it back to focus on the spaces between the sound.";
logo = "http://cdn-images.audioaddict.com/a/9/1/b/1/4/a91b1414a8712794672e3ea1324ffe92.jpg?size=180x180";
station = di-fm-name "Minimal";
stream = di-fm "minimal";
}
{
desc = "Pitched up vocals, happy hardcore beats, and high energy music non-stop.";
logo = "http://cdn-images.audioaddict.com/e/f/8/f/b/e/ef8fbe63f86e496f0ce514ee2e85c30a.jpg?size=180x180";
station = di-fm-name "Nightcore";
stream = di-fm "nightcore";
}
{
desc = "Modern disco music blending the familiar funk of the 70s and 80s with futuristic beats and up to date grooves.";
logo = "http://cdn-images.audioaddict.com/f/2/3/7/8/a/f2378a19d61a3063a2a6271a29fb1595.jpg?size=180x180";
station = di-fm-name "Nu Disco";
stream = di-fm "nudisco";
}
{
desc = "Acid, one of the characteristics of the TB-303, is celebrated here with the best tracks from house, techno and trance.";
logo = "http://cdn-images.audioaddict.com/7/0/a/7/8/3/70a7830bce8d22eb1a7c868773f443e8.jpg?size=180x180";
station = di-fm-name "Oldschool Acid";
stream = di-fm "oldschoolacid";
}
{
desc = "The biggest classics and secret weapons this is a true treasure chest of house tracks from back in the day.";
logo = "http://cdn-images.audioaddict.com/7/d/0/c/e/f/7d0cefbcb479ce257b24471f3d600eba.jpg?size=180x180";
station = di-fm-name "Oldschool House";
stream = di-fm "oldschoolhouse";
}
{
desc = "Grab your whistles, white gloves and reach for the laser beams. This is the sound of raving when raving was new.";
logo = "http://cdn-images.audioaddict.com/b/1/0/c/2/6/b10c2672a6a54a8ae5356f3ddb49b4c1.jpg?size=180x180";
station = di-fm-name "Oldschool Rave";
stream = di-fm "oldschoolrave";
}
{
desc = "Go back in time and hear the biggest and best tracks within techno and trance that defined a decade of dance culture.";
logo = "http://cdn-images.audioaddict.com/2/4/9/d/1/8/249d182058ac9e5631557eb309efe80f.jpg?size=180x180";
station = di-fm-name "Oldschool Techno & Trance";
stream = di-fm "oldschool";
}
{
desc = "Always moving forward, progressive continues to reinvent itself into new sounds and styles made for the floor.";
logo = "http://cdn-images.audioaddict.com/3/3/5/5/3/1/3355314492d633a5330c659cfe98fc1b.jpg?size=180x180";
station = di-fm-name "Progressive";
stream = di-fm "progressive";
}
{
desc = "Progress your mind to undiscovered psychedelic dimensions.";
logo = "http://cdn-images.audioaddict.com/5/f/a/5/6/5/5fa5659badbaf1a4ff817323ee5e998a.jpg?size=180x180";
station = di-fm-name "Progressive Psy";
stream = di-fm "progressivepsy";
}
{
desc = "Downtempo psychedelic dub grooves, goa ambient, and world beats.";
logo = "http://cdn-images.audioaddict.com/4/5/2/d/1/4/452d14ab72381941b1bd5f94af15678b.jpg?size=180x180";
station = di-fm-name "PsyChill";
stream = di-fm "psychill";
}
{
desc = "Dub, ambient, and psychedelic trance, fused together in atmospheric harmony.";
logo = "http://cdn-images.audioaddict.com/4/0/0/d/5/3/400d53d541322f0883a807c9b79d5540.jpg?size=180x180";
station = di-fm-name "PsyDub";
stream = di-fm "psydub";
}
{
desc = "The psychedelic side of ambient.";
logo = "http://cdn-images.audioaddict.com/a/7/b/0/d/c/a7b0dcee2110e6d01fec96758a639ea3.jpg?size=180x180";
station = di-fm-name "Psybient";
stream = di-fm "psybient";
}
{
desc = "Russia's hottest club hits.";
logo = "http://cdn-images.audioaddict.com/5/8/2/6/2/e/58262e338e405ab82ab92aa55f719f86.jpg?size=180x180";
station = di-fm-name "Russian Club Hits";
stream = di-fm "russianclubhits";
}
{
desc = "House music saturated with feeling full of melodies, vocals and true soul. Steady warm 4/4 vibes.";
logo = "http://cdn-images.audioaddict.com/e/6/5/5/c/d/e655cd614bd4a1c981273a555081c309.jpg?size=180x180";
station = di-fm-name "Soulful House";
stream = di-fm "soulfulhouse";
}
{
desc = "Ambient space music for expanding minds.";
logo = "http://cdn-images.audioaddict.com/b/e/c/b/e/0/becbe0cb9c3002fc21f97f9e65cf9da1.jpg?size=180x180";
station = di-fm-name "Space Dreams";
stream = di-fm "spacemusic";
}
{
desc = "This selection of summer chill house classics has been handpicked to elicit that special summer feeling year-round.";
logo = "http://cdn-images.audioaddict.com/3/d/8/b/6/1/3d8b619652faa1969274e0d51c8bd59d.jpg?size=180x180";
station = di-fm-name "Summer Chill House";
stream = di-fm "summerchillhouse";
}
{
desc = "Influenced by video games and movie soundtracks of the 80s, Synthwave's mission continues today with great new music keeping things future retro.";
logo = "http://cdn-images.audioaddict.com/d/8/e/a/6/4/d8ea647113c8cdec87b4751f20b3360b.jpg?size=180x180";
station = di-fm-name "Synthwave";
stream = di-fm "synthwave";
}
{
desc = "Blending the warmth of house music with the cold structural precision of techno, tech house bridges the divide.";
logo = "http://cdn-images.audioaddict.com/2/7/b/a/7/0/27ba70234566a810d9dd33745195f088.jpg?size=180x180";
station = di-fm-name "Tech House";
stream = di-fm "techhouse";
}
{
desc = "Techno is a true musical force full of structure and style. Robotic, mechanical and full of soul, always facing the future.";
logo = "http://cdn-images.audioaddict.com/7/a/3/1/4/a/7a314a3ff87e31013172e9099d9aa843.jpg?size=180x180";
station = di-fm-name "Techno";
stream = di-fm "techno";
}
{
desc = "Emotive dance music which embraces incredible melodies, future-facing production and energetic anthems heard worldwide.";
logo = "http://cdn-images.audioaddict.com/b/1/0/5/6/7/b10567777ad265dcc63816fa32396654.jpg?size=180x180";
station = di-fm-name "Trance";
stream = di-fm "trance";
}
{
desc = "Born out of Southern Hip-Hop and influenced by techno, trap is analog drum machines / DnB & with hip-hop aesthetics.";
logo = "http://cdn-images.audioaddict.com/8/8/6/e/b/2/886eb22e09893237ff5a851991543e4b.jpg?size=180x180";
station = di-fm-name "Trap";
stream = di-fm "trap";
}
{
desc = "The percussive side of the house and tech house scene, tribal house takes drums and puts them in the forefront.";
logo = "http://cdn-images.audioaddict.com/5/9/d/5/b/0/59d5b064c1bc9e165850a8d9371d32a5.jpg?size=180x180";
station = di-fm-name "Tribal House";
stream = di-fm "tribalhouse";
}
{
desc = "UMF Radio 24/7";
logo = "http://cdn-images.audioaddict.com/b/4/5/7/b/9/b457b9fe45596e28a7c4b7b004c82ce4.jpg?size=180x180";
station = di-fm-name "UMF Radio";
stream = di-fm "umfradio";
}
{
desc = "From gritty Berlin streets to dark corners of Brooklyn, this is techno made by artists pushing the genre further.";
logo = "http://cdn-images.audioaddict.com/9/f/7/1/0/f/9f710f7f4c2a663bab3ff5551f8669eb.jpg?size=180x180";
station = di-fm-name "Underground Techno";
stream = di-fm "undergroundtechno";
}
{
desc = "Relaxing vibes and a collection of vocal songs providing the laid back soundtrack to your day.";
logo = "http://cdn-images.audioaddict.com/5/7/4/8/8/c/57488ced7c732709c72764636b0065dc.jpg?size=180x180";
station = di-fm-name "Vocal Chillout";
stream = di-fm "vocalchillout";
}
{
desc = "The glorious 4/4 thump of House music paired perfectly with the human voice. Sultry, soulful, sexy sounds.";
logo = "http://cdn-images.audioaddict.com/8/5/a/1/3/b/85a13bb220281bf22bf04d4f1f778b59.jpg?size=180x180";
station = di-fm-name "Vocal House";
stream = di-fm "vocalhouse";
}
{
desc = "Laid back grooves and a collection of smooth vocals soothe the ears and relax the mind.";
logo = "http://cdn-images.audioaddict.com/8/4/3/6/f/9/8436f9d3338ba7c8de0e88dbe45ea4d5.jpg?size=180x180";
station = di-fm-name "Vocal Lounge";
stream = di-fm "vocallounge";
}
{
desc = "Lush vocals paired together with emotive dance music. Beautiful melodies and endless energy.";
logo = "http://cdn-images.audioaddict.com/3/0/9/f/2/4/309f243a8a181ad83e8c5e15cd4b24c3.jpg?size=180x180";
station = di-fm-name "Vocal Trance";
stream = di-fm "vocaltrance";
}
@@ -1255,15 +1173,15 @@ importJSON ./radiorecord.json
station = "Dhol Radio";
desc = " ";
}
{ logo = bhaktiworld-logo; stream = bhaktiworld "2bhanuman"; station = bhaktiworld-name "Hanuman"; }
{ logo = bhaktiworld-logo; stream = bhaktiworld "djbeat"; station = bhaktiworld-name "Mantra Shakti"; }
{ logo = bhaktiworld-logo; stream = bhaktiworld "gurbani"; station = bhaktiworld-name "Sangam"; }
{ logo = bhaktiworld-logo; stream = bhaktiworld "hot"; station = bhaktiworld-name "Shiv"; }
{ logo = bhaktiworld-logo; stream = bhaktiworld "ibadat"; station = bhaktiworld-name "Devi Maa"; }
{ logo = bhaktiworld-logo; stream = bhaktiworld "iskon2b"; station = bhaktiworld-name "Om Sai"; }
{ logo = bhaktiworld-logo; stream = bhaktiworld "millenniumhits"; station = bhaktiworld-name "Krishna"; }
{ logo = bhaktiworld-logo; stream = bhaktiworld "dard"; station = bhaktiworld-name "Shri Ram"; }
{ logo = bhaktiworld-logo; stream = bhaktiworld "bhaktiworldindia"; station = bhaktiworld-name "Ganesh"; }
{ stream = bhaktiworld "2bhanuman"; station = bhaktiworld-name "Hanuman"; }
{ stream = bhaktiworld "djbeat"; station = bhaktiworld-name "Mantra Shakti"; }
{ stream = bhaktiworld "gurbani"; station = bhaktiworld-name "Sangam"; }
{ stream = bhaktiworld "hot"; station = bhaktiworld-name "Shiv"; }
{ stream = bhaktiworld "ibadat"; station = bhaktiworld-name "Devi Maa"; }
{ stream = bhaktiworld "iskon2b"; station = bhaktiworld-name "Om Sai"; }
{ stream = bhaktiworld "millenniumhits"; station = bhaktiworld-name "Krishna"; }
{ stream = bhaktiworld "dard"; station = bhaktiworld-name "Shri Ram"; }
{ stream = bhaktiworld "bhaktiworldindia"; station = bhaktiworld-name "Ganesh"; }
{
station = "Rockabilly Radio";
stream = "http://lin3.ash.fast-serv.com:6026/stream_96";
@@ -1419,16 +1337,6 @@ importJSON ./radiorecord.json
station = "The UK 1950s Radio Station";
logo = "http://www.1950sukradio.co.uk/images/page_componants/1950s_Station_Logo.png";
}
{
stream = "https://rhb-de-hz-fal-stream02-cluster01.radiohost.de/paradiso-jazz_mp3-128";
station = "Paradiso Jazz";
logo = "https://www.paradiso.de/wp-content/uploads/2019/11/191111_Paradiso-Jazz.jpg";
}
{
stream = "https://rhb-stream20.radiohost.de/paradiso-nashville_mp3-128";
station = "Paradiso Nashville";
logo = "https://www.paradiso.de/wp-content/uploads/2019/11/191111_Paradiso-Nashville.jpg";
}
{
stream = stereoscenic "mod-h";
station = stereoscenic-name "Ambient Modern";

View File

@@ -17,16 +17,14 @@ let maplocalleader="\\"
" noremap <Leader>h :<C-u>split<CR>
" noremap <Leader>v :<C-u>vsplit<CR>
noremap <Leader>gs :Gstatus<CR>
noremap <Leader>gc :Gcommit<CR>
noremap <Leader>gs :Git<CR>
noremap <Leader>gc :Git commit<CR>
noremap <leader>n :bn<CR>
noremap <leader>p :bp<CR>
noremap <leader>c :bd<CR>
noremap <leader>b :Buffers<CR>
noremap <leader>t :Tags<CR>
noremap <leader>f :Goyo<CR>
" reindent whole file
noremap <leader>i mzgg=G`z
@@ -62,18 +60,17 @@ set list listchars=tab:⇥\ ,extends:,precedes:,nbsp:␣,trail:· showbrea
set foldlevelstart=30
iabbrev ddate <C-R>=strftime("%F")<CR>
iabbrev dtime <C-R>=strftime("%F %T")<CR>
" if exists("g:loaded_netrwPlugin")
let g:netrw_banner=0
let g:netrw_browse_split=4
let g:netrw_altv=1 " open splits to the right
let g:netrw_liststyle=3 " tree view
let g:netrw_list_hide=netrw_gitignore#Hide()
let g:netrw_list_hide.=',\(^\|\s\s\)\zs\.\S\+'
" endif
" call matchadd('colorcolumn', '\%101v', 100)
" highlight colorcolumn ctermbg=red
call matchadd('colorcolumn', '\%101v', 100)
highlight colorcolumn ctermbg=red
" undofile - This allows you to use undos after exiting and restarting
" This, like swap and backups, uses .vim-undo first, then ~/.vim/undo
@@ -82,8 +79,7 @@ if exists("+undofile")
if isdirectory($HOME . '/.vim/undo') == 0
:silent !mkdir -p ~/.vim/undo > /dev/null 2>&1
endif
set undodir=./.vim-undo//
set undodir+=~/.vim/undo//
set undodir=~/.vim/undo/
set undofile
endif
@@ -113,60 +109,37 @@ command! ToggleBackground call s:toggle_background()
inoremap <F12> <C-O>:ToggleBackground<CR>
nnoremap <F12> :ToggleBackground<CR>
if has("autocmd")
autocmd bufnewfile,bufread *.4th set filetype=forth
autocmd bufnewfile,bufread *.asm set filetype=nasm
autocmd bufnewfile,bufread *.c set keywordprg=man\ 3
autocmd bufnewfile,bufread *.conf set filetype=conf
autocmd bufnewfile,bufread *.fs packadd vim-fsharp | set filetype=fsharp
autocmd bufnewfile,bufread *.h set keywordprg=man\ 3
autocmd bufnewfile,bufread *.nix packadd vim-nix | set filetype=nix | set path+=/var/src
autocmd bufnewfile,bufread *.rust packadd rust-vim " | packadd deoplete-rust
autocmd bufnewfile,bufread *.csv packadd csv-vim | set filetype=csv
autocmd bufnewfile,bufread *.toml packadd vim-toml | set filetype=toml
autocmd bufnewfile,bufread *.nim packadd nim-vim | set filetype=nim
autocmd bufnewfile,bufread *.tex packadd vimtex | set filetype=tex
autocmd bufnewfile,bufread *.ics packadd icalendar.vim | set filetype=icalendar
autocmd bufnewfile,bufread *.ts packadd typescript-vim | set filetype=typescript
autocmd bufnewfile,bufread *.purs packadd purescript-vim | set filetype=purescript
autocmd bufnewfile,bufread *.jq packadd jq.vim
autocmd bufnewfile,bufread *.re packadd vim-reason-plus | set filetype=reason
autocmd bufnewfile,bufread *.journal packadd vim-ledger | set filetype=ledger shiftwidth=4
autocmd bufnewfile,bufread urls,config set filetype=conf
autocmd bufnewfile,bufread *.elm packadd elm-vim | set filetype=elm shiftwidth=4
autocmd bufnewfile,bufread *.dhall packadd dhall-vim | set filetype=dhall
autocmd filetype haskell packadd haskell-vim | set keywordprg=hoogle\ -i
autocmd filetype javascript packadd vim-javascript
autocmd filetype make setlocal noexpandtab
autocmd filetype html packadd emmet-vim
autocmd filetype gitcommit setlocal spell spelllang=en
autocmd filetype mail setlocal spell spelllang=de textwidth=0 | command Send %! mail-send
autocmd bufreadpost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif
autocmd bufreadpre * setlocal foldmethod=indent
" autocmd bufwritepre * :call <SID>StripTrailingWhitespaces()
" autocmd bufwinenter * if &fdm == 'indent' | setlocal foldmethod=manual | endif
autocmd bufnewfile,bufread *.4th set filetype=forth
autocmd bufnewfile,bufread *.asm set filetype=nasm
autocmd bufnewfile,bufread *.c set keywordprg=man\ 3
autocmd bufnewfile,bufread *.h set keywordprg=man\ 3
autocmd bufnewfile,bufread *.conf set filetype=conf
autocmd bufnewfile,bufread *.nix packadd vim-nix | set filetype=nix | set path+=/var/src
autocmd bufnewfile,bufread *.rust packadd rust-vim
autocmd bufnewfile,bufread *.csv packadd csv.vim | set filetype=csv
autocmd bufnewfile,bufread *.tex packadd vimtex | set filetype=tex
autocmd bufnewfile,bufread *.ics packadd icalendar.vim | set filetype=icalendar
autocmd bufnewfile,bufread *.ts packadd typescript-vim | set filetype=typescript
autocmd bufnewfile,bufread *.jq packadd jq.vim
autocmd bufnewfile,bufread *.journal packadd vim-ledger | set filetype=ledger shiftwidth=4
autocmd bufnewfile,bufread urls,config set filetype=conf
autocmd bufnewfile,bufread *.elm packadd elm-vim | set filetype=elm shiftwidth=4
autocmd bufnewfile,bufread *.md packadd vim-pandoc | packadd vim-pandoc-syntax | set filetype=pandoc
autocmd filetype haskell packadd haskell-vim | set keywordprg=hoogle\ -i
autocmd filetype javascript packadd vim-javascript
autocmd filetype make setlocal noexpandtab
autocmd VimEnter * UpdateRemotePlugins
endif
autocmd filetype html packadd emmet-vim
autocmd filetype gitcommit setlocal spell spelllang=en
autocmd filetype mail setlocal spell spelllang=de textwidth=0
autocmd bufreadpost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif
autocmd bufreadpre * setlocal foldmethod=indent
let g:startify_custom_header = ''
" let g:deoplete#enable_at_startup = 1
set completeopt=noinsert,menuone,noselect
set complete+=kspell
" let g:deoplete#sources = {}
" let g:deoplete#sources._ = ['ale', 'file', 'omni', 'buffer']
"
" let g:deoplete#sources#rust#racer_binary = $HOME . '/.cargo/bin/racer'
" let g:deoplete#sources#rust#rust_source_path = substitute(system('rustc --print sysroot'), '\n$', '', '') . '/lib/rustlib/src/rust/src'
inoremap ^] ^X^]
inoremap ^F ^X^F
inoremap ^D ^X^D
inoremap ^L ^X^L
let g:SuperTabDefaultCompletionType = 'context'
@@ -196,7 +169,6 @@ let g:ale_fixers = {
\ 'typescript': ['prettier'],
\ 'css': ['prettier'],
\ 'html': ['prettier'],
\ 'markdown': ['prettier'],
\ 'json': ['jq'],
\ 'python': ['black'],
\ 'rust': ['rustfmt']
@@ -208,29 +180,5 @@ autocmd bufnewfile,bufread elm.json let g:ale_fix_on_save = 0
let g:ale_completion_enabled = 1
"if exists("g:loaded_airline")
" set noshowmode laststatus=0 noruler
let g:airline#extensions#tabline#close_symbol = 'X'
let g:airline#extensions#tabline#enabled = 0
"let g:airline#extensions#tabline#left_alt_sep = ''
"let g:airline#extensions#tabline#left_sep = ''
"let g:airline#extensions#tabline#right_alt_sep = ''
"let g:airline#extensions#tabline#right_sep = ''
let g:airline#extensions#tabline#show_close_button = 1
let g:airline#extensions#tabline#show_tab_type = 0
let g:airline#extensions#tabline#tab_min_count = 2
let g:airline#extensions#tabline#tab_nr_type = 0
let g:airline#extensions#tmuxline#enabled = 0
"let g:airline#extensions#wordcount#enabled = 1
"let g:airline_left_alt_sep = ''
"let g:airline_left_sep = ''
"let g:airline_right_alt_sep = ''
"let g:airline_right_sep = ''
let g:airline_section_z = '%{line(".")}/%{line("$")} %{col(".")}'
"endif
"if exists("g:loaded_airline_themes")
let g:airline_theme='base16'
"endif
let g:vimwiki_list = [{'path': '~/notes/',
\ 'syntax': 'markdown', 'ext': '.md'}]
\ 'syntax': 'markdown', 'ext': '.md'}]

View File

@@ -34,6 +34,7 @@ in {
(name: _: builtins.readFile "${<retiolum/hosts>}/${name}")
(builtins.readDir <retiolum/hosts>);
rsaPrivateKeyFile = toString <system-secrets/retiolum.key>;
ed25519PrivateKeyFile = toString <system-secrets/retiolum.ed25519>;
extraConfig = ''
LocalDiscovery = yes
AutoConnect = yes

View File

@@ -9,7 +9,7 @@ let
startAt = bot.time;
serviceConfig.Type = "oneshot";
wants = [ "network-online.target" ];
script = strings.concatStringsSep "\n" ([ "QUOTE=$(${bot.command})" ]
script = strings.concatStringsSep "\n" ([ "QUOTE=$(${bot.command})" "if [ -n \"$QUOTE\" ]; then" ]
++ map (chatId: ''
${pkgs.curl}/bin/curl -s -X POST "https://api.telegram.org/bot${bot.token}/sendMessage" \
-d chat_id="${chatId}" \
@@ -17,7 +17,8 @@ let
lib.strings.optionalString (bot.parseMode != null)
"-d parse_mode=${bot.parseMode}"
}
'') bot.chatIds);
'') bot.chatIds
++ [ "fi" ]);
};
in {
options.niveum.telegramBots = mkOption {
@@ -27,7 +28,7 @@ in {
time = mkOption { type = types.str; };
token = mkOption { type = types.strMatching "[0-9A-Za-z:-]+"; };
chatIds = mkOption {
type = types.listOf (types.strMatching "[0-9]+|@[A-Za-z0-9]+");
type = types.listOf (types.strMatching "-?[0-9]+|@[A-Za-z0-9]+");
};
command = mkOption { type = types.str; };
parseMode = mkOption {

View File

@@ -2,14 +2,7 @@
with lib;
let
cfg = config.niveum.traadfri;
traadfri = let
traadfri-package = pkgs.fetchFromGitHub {
owner = "kmein";
repo = "traadfri";
rev = "a55b778cf4c7f124e75070b056c90f5a8043bc45";
sha256 = "10ggqksdbgmcwc2f3xs6abjf9zpvv554xfl3b3bblmfijgr6srv9";
};
in pkgs.callPackage traadfri-package {
traadfri = pkgs.callPackage <traadfri> {
libcoap = pkgs.callPackage <niveum/packages/libcoap.nix> { tls = true; };
};
in {
@@ -29,12 +22,6 @@ in {
};
config = mkIf cfg.enable {
environment.shellAliases = lib.attrsets.mapAttrs' (name: value:
lib.nameValuePair "traadfri-${name}" "traadfri --target Bulb ${toString value}")
cfg.bulbs // lib.attrsets.mapAttrs' (name: value:
lib.nameValuePair "traadfri-${name}" "traadfri --target Room ${toString value}")
cfg.rooms;
environment.systemPackages = [
(pkgs.writers.writeDashBin "traadfri" ''
TRAADFRI_USER="${cfg.user}" \
@@ -42,6 +29,11 @@ in {
TRAADFRI_HUB="${cfg.host}" \
${traadfri}/bin/traadfri $@
'')
];
] ++ lib.mapAttrsToList (name: value: pkgs.writers.writeDashBin "traadfri-${name}" ''
exec traadfri --target Room ${toString value} "$@"
'') cfg.rooms
++ lib.mapAttrsToList (name: value: pkgs.writers.writeDashBin "traadfri-${name}" ''
exec traadfri --target Bulb ${toString value} "$@"
'') cfg.bulbs;
};
}

View File

@@ -1,13 +1,7 @@
{ config, lib, pkgs, ... }:
with lib;
let
tuna-src = pkgs.fetchFromGitHub {
owner = "kmein";
repo = "tuna";
rev = "1cbed44069a3009738afdafecefe0a05316039a6";
sha256 = "0i7vjzv4hf8fdz9j09cdnvfhyylh0izsdhjs4q0qw9g5nrc9pyir";
};
tuna = pkgs.callPackage tuna-src {};
tuna = pkgs.callPackage <tuna> {};
cfg = config.services.tuna;
in {
imports = [];

View File

@@ -1 +0,0 @@
import <nixpkgs-mozilla>

27
packages/daybook.nix Normal file
View File

@@ -0,0 +1,27 @@
{ lib, stdenv, makeWrapper, pandoc, fetchFromGitHub }:
stdenv.mkDerivation {
name = "daybook";
src = fetchFromGitHub {
owner = "kmein";
repo = "daybook";
rev = "db2c34830e09183c80f3381bf5e4c44d52f05d53";
sha256 = "0nbsv8f12qh5spq7zhimhdf3p7msk33xrb0ilqvlc6jmlkpislmv";
};
nativeBuildInputs = [ makeWrapper ];
buildInputs = [ pandoc ];
buildPhase = ''
mkdir -p $out/man/man1
pandoc --standalone --to man daybook.1.md -o $out/man/man1/daybook.1
'';
installPhase = ''
mkdir -p $out/bin
install daybook $out/bin
wrapProgram $out/bin/daybook --prefix PATH ":" ${pandoc}/bin ;
'';
meta = with lib; {
homepage = https://github.com/kmein/daybook;
description = "A diary writing utility in sh";
license = licenses.mit;
platforms = platforms.linux;
};
}

29
packages/depp.nix Normal file
View File

@@ -0,0 +1,29 @@
{ lib, writeShellScriptBin }:
let
aliasFlag = name: value: "-c alias.${name}=${lib.escapeShellArg value}";
aliases = {
eroeffne = "init";
machnach = "clone";
zieh = "pull";
fueghinzu = "add";
drueck = "push";
pfusch = "push --force";
zweig = "branch";
verzweige = "branch";
uebergib = "commit";
erde = "rebase";
unterscheide = "diff";
vereinige = "merge";
bunkere = "stash";
markiere = "tag";
nimm = "checkout";
tagebuch = "log";
zustand = "status";
};
in writeShellScriptBin "depp" ''
if [ $# -gt 0 ]; then
git ${lib.concatStringsSep " " (lib.attrsets.mapAttrsToList aliasFlag aliases)} "$@"
else
printf "${lib.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v: n + " " + v) aliases)}\n"
fi
''

28
packages/devour.nix Normal file
View File

@@ -0,0 +1,28 @@
{ lib, stdenv, xdo, makeWrapper, fetchFromGitHub }:
stdenv.mkDerivation {
name = "devour";
version = "master";
src = fetchFromGitHub {
owner = "salman-abedin";
repo = "devour";
rev = "ceb871c3046ce290c27e2887365b9a19ca38113c";
sha256 = "0f2jb8knx7lqy6wmf3rchgq2n2dj496lm8vgcs58rppzrmsk59d5";
};
nativeBuildInputs = [ makeWrapper ];
buildInputs = [ xdo ];
DESTDIR="$(out)";
fixupPhase = ''
wrapProgram $out/bin/devour --prefix PATH ":" ${xdo}/bin ;
'';
meta = with lib; {
homepage = "https://github.com/salman-abedin/devour";
description = "Window Manager agnostic swallowing feature for terminal emulators";
license = licenses.gpl3;
platforms = platforms.all;
};
}

30
packages/mahlzeit.nix Normal file
View File

@@ -0,0 +1,30 @@
{ lib, fetchFromGitHub, mkDerivation, ansi-terminal, base, directory, doctest, filepath
, megaparsec, optparse-applicative, prettyprinter, process
, raw-strings-qq, stdenv, tasty, tasty-hunit, text, yaml
}:
mkDerivation {
pname = "mahlzeit";
version = "0.1.0";
src = fetchFromGitHub {
owner = "kmein";
repo = "mahlzeit";
rev = "954c0fb3f45815999bc65d003794af6a850b069c";
sha256 = "046yrr40hjmxkjmwzcvmwb39fxx2v2i6hgdxrjfiwilzvhikarrg";
};
isLibrary = true;
isExecutable = true;
libraryHaskellDepends = [
ansi-terminal base directory filepath megaparsec prettyprinter text
yaml
];
executableHaskellDepends = [
ansi-terminal base directory filepath optparse-applicative process
text yaml
];
testHaskellDepends = [
base doctest megaparsec raw-strings-qq tasty tasty-hunit
];
homepage = "https://github.com/kmein/mahlzeit";
description = "Recipe toolkit";
license = lib.licenses.mit;
}

14
packages/man/pandoc.nix Normal file
View File

@@ -0,0 +1,14 @@
{ stdenv, pandoc, lib, fetchgit }:
stdenv.mkDerivation {
name = "pandoc-doc";
version = pandoc.version;
src = fetchgit {
url = "https://github.com/jgm/pandoc";
rev = pandoc.version;
sha256 = "0s4mczbql35wh6bhyi542yln24f530rlsw6akcv7lmp083rrlpy4";
};
buildPhase = ''
mkdir -p $out/man/man1
${pandoc}/bin/pandoc -V section=1 --standalone --write=man $src/MANUAL.txt -o $out/man/man1/pandoc.1
'';
}

26
packages/opustags.nix Normal file
View File

@@ -0,0 +1,26 @@
{ lib, stdenv, cmake, pkgconfig, libogg, fetchFromGitHub }:
stdenv.mkDerivation rec {
name = "opustags";
version = "1.3.0";
src = fetchFromGitHub {
owner = "fmang";
repo = "opustags";
rev = version;
sha256 = "09z0cdg20algaj2yyhfz3hxh1biwjjvzx1pc2vdc64n8lkswqsc1";
};
cmakeFlags = [
"-DCMAKE_INSTALL_PREFIX=$out"
];
buildInputs = [ libogg ];
nativeBuildInputs = [ cmake pkgconfig ];
meta = with lib; {
homepage = "https://github.com/fmang/opustags";
description = "Ogg Opus tags editor";
platforms = platforms.all;
};
}

View File

@@ -0,0 +1,12 @@
{ fetchPypi, buildPythonPackage, pygtrie, ... }:
buildPythonPackage rec {
pname = "betacode";
version = "0.2";
src = fetchPypi {
inherit pname version;
sha256 = "08fnjzjvnm9m6p4ddyr8qgfb9bs2nipv4ls50784v0xazgxx7siv";
};
preBuild = ''echo > README.rst'';
propagatedBuildInputs = [ pygtrie ];
doCheck = false;
}

View File

@@ -0,0 +1,14 @@
{ fetchFromGitHub, buildPythonPackage, backports_functools_lru_cache, selenium, regex, ... }:
buildPythonPackage rec {
pname = "indic_transliteration";
version = "unstable-2020-12-15";
src = fetchFromGitHub {
repo = pname;
owner = "sanskrit-coders";
rev = "2ea25a03af15937916b6768835e056166986c567";
sha256 = "1pcf800hl0zkcffc47mkjq9mizsxdi0hwxlnij5bvbqdshd3w9ll";
};
patches = [ ./regex-version.patch ];
propagatedBuildInputs = [ backports_functools_lru_cache selenium regex ];
doCheck = false;
}

View File

@@ -0,0 +1,9 @@
diff --git a/requirements.txt b/requirements.txt
index 76b12d7..27fdc79 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,3 @@
backports.functools_lru_cache==1.6.1
selenium==3.141.0
-regex==2020.10.11
+regex>=2020.7.14

View File

@@ -0,0 +1,12 @@
{ buildPythonApplication, fetchPypi, requests }:
let
in buildPythonApplication rec {
pname = "instaloader";
version = "4.2.4";
src = fetchPypi {
inherit pname version;
sha256 = "02zqb02idk2pzks7dv42vigcmmpjpfhfdyjp911yr0ix7dy3q0b9";
};
propagatedBuildInputs = [ requests ];
doCheck = false;
}

View File

@@ -0,0 +1,10 @@
{ fetchPypi, buildPythonPackage, ... }:
buildPythonPackage rec {
pname = "pygtrie";
version = "2.3";
src = fetchPypi {
inherit pname version;
sha256 = "00x7q4p9r75zdnw3a8vd0d0w0i5l28w408g5bsfl787yv6b1h9i8";
};
doCheck = false;
}

View File

@@ -0,0 +1,23 @@
{ buildPythonPackage, buildPythonApplication, fetchPypi, pytestrunner, six, beautifulsoup4, requests, dbus-python }:
let
lyricwikia = buildPythonPackage rec {
pname = "lyricwikia";
version = "0.1.9";
src = fetchPypi {
inherit pname version;
sha256 = "0sa5wkbgp5bpgkl8hgn7byyz9zj0786647ikf2l0k8m4fimq623y";
};
buildInputs = [ pytestrunner ];
propagatedBuildInputs = [ six beautifulsoup4 requests ];
doCheck = false;
};
in buildPythonApplication rec {
pname = "spotify-cli-linux";
version = "1.4.2";
src = fetchPypi {
inherit pname version;
sha256 = "1gxich3v2i4lmh60abbw3mw15399afvvqflv8g6plvvbmvxmbgp0";
};
propagatedBuildInputs = [ lyricwikia dbus-python ];
doCheck = false;
}

View File

@@ -0,0 +1,28 @@
regex: https://www.radioeins.de/musik/cd_der_woche/
selectors:
httpsettings:
cookie: {}
header: {}
useragent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/90.0.4430.72 Safari/537.36
insecure: false
feed:
title: .boxhead h2
description: .manualteaserShortText
authorname: ""
authoremail: ""
item:
container: .doctyperezension
title: h2 a.rezension
link: a.rezension
linkattr: href
created: .manualteaserDateTime
createdformat: 02.01.2006
description: .manualteaserShortText
content: ""
image: picture > img
imageattr: src
nextpage: ""
nextpageattr: href
nextpagecount: 0
sort: ""

31
packages/scripts/auc.nix Normal file
View File

@@ -0,0 +1,31 @@
{ stdenv, fetchFromGitHub, lib, pandoc }:
let
owner = "kamalist";
in
stdenv.mkDerivation rec {
pname = "auc";
version = "2019-04-02";
src = fetchFromGitHub {
inherit owner;
repo = "AUC";
rev = "66d1cd57472442b4bf3c1ed12ca5cadd57d076b3";
sha256 = "0gb4asmlfr19h42f3c5wg9c9i3014if3ymrqan6w9klgzgfyh2la";
};
installPhase = ''
mkdir -p $out/{bin,man/man1}
install auc $out/bin
${pandoc}/bin/pandoc -V title=${lib.escapeShellArg pname} -V section=1 $src/README.md -s -t man -o $out/man/man1/auc.1
'';
meta = with lib; {
description = "Command-line Roman calendar";
longDescription = ''
AUC (Ab Urbe condita) is a command-line Roman calendar tool. Currently it shows the specified date in the format of the Ancient Romans.
'';
license = licenses.mit;
maintainers = [ maintainers.kmein ];
platforms = platforms.all;
};
}

View File

@@ -1,7 +1,8 @@
{ pkgs, lib, ... }:
let
nur = import <niveum/submodules/nur-packages> {};
kpaste = pkgs.callPackage <stockholm/krebs/5pkgs/simple/kpaste> { };
opustags = pkgs.callPackage <niveum/packages/opustags.nix> { };
betacode = pkgs.callPackage <niveum/packages/python3Packages/betacode.nix> { };
wrapScript = { packages ? [ ], name, script }:
pkgs.writers.writeDashBin name ''
PATH=$PATH:${
@@ -16,6 +17,8 @@ let
sha256 = "0c4hkny4zkknlimc9yi9ljss2cws4zn8lzd8ip9b8mfsm094dlfl";
};
in rec {
auc = pkgs.callPackage ./auc.nix {};
instaget = wrapScript {
packages = [ pkgs.jq pkgs.curl pkgs.gnugrep ];
script = ./instaget.sh;
@@ -78,9 +81,17 @@ in rec {
'';
qrpaste = pkgs.writers.writeDashBin "qrpaste" ''
file="$(${pkgs.mktemp}/bin/mktemp qrpasteXXX.png --tmpdir)"
file="$(${pkgs.mktemp}/bin/mktemp --tmpdir)"
trap clean EXIT
clean() {
rm "$file"
}
${pkgs.qrencode}/bin/qrencode "$(${pkgs.xclip}/bin/xclip -selection clipboard -out)" -o "$file"
${pkgs.sxiv}/bin/sxiv "$file" ; rm "$file"
${pkgs.sxiv}/bin/sxiv "$file"
'';
ttspaste = pkgs.writers.writeDashBin "ttspaste" ''
${pkgs.xclip}/bin/xclip -selection clipboard -out | ${pkgs.curl}/bin/curl -G http://tts.r/api/tts --data-urlencode 'text@-' | ${pkgs.mpv}/bin/mpv -
'';
interdimensional-cable =
@@ -96,7 +107,7 @@ in rec {
'';
tag = wrapScript {
packages = [ pkgs.vorbisTools pkgs.python3Packages.eyeD3 nur.opustags ];
packages = [ pkgs.vorbisTools pkgs.python3Packages.eyeD3 opustags ];
script = "${voidrice}/.local/bin/tag";
name = "tag";
};
@@ -283,27 +294,46 @@ in rec {
packages = [ pkgs.xdo ];
};
ipa = wrapScript {
script = ./ipa.py;
name = "ipa";
packages = [ pkgs.python3 ];
};
ipa = pkgs.writers.writeHaskellBin "ipa" {
libraries = with pkgs; [ haskellPackages.text haskellPackages.ipa ];
} ''
import Data.Maybe (fromJust)
import Language.IPA
import qualified Data.Text as T
import qualified Data.Text.IO as T
main = T.interact (T.unwords . map (unIPA . fromJust . (xSampaToIpa =<<) . mkXSampa) . T.words)
'';
default-gateway = pkgs.writers.writeDashBin "default-gateway" ''
${pkgs.iproute}/bin/ip -json route | ${pkgs.jq}/bin/jq --raw-output '.[0].gateway'
'';
betacode = pkgs.writers.writePython3Bin "betacode" {
libraries = [ nur.python3Packages.betacode ];
betacode = pkgs.writers.writeHaskellBin "betacode" {
libraries = with pkgs; [
(haskell.lib.unmarkBroken (haskell.lib.doJailbreak haskellPackages.betacode))
haskellPackages.text
];
} ''
import betacode.conv
import sys
sys.stdout.write(betacode.conv.beta_to_uni(sys.stdin.read()))
import qualified Data.Text.IO as T
import qualified Data.Text as T
import Text.BetaCode
main = T.interact (either (error . T.unpack) id . fromBeta)
'';
devanagari = pkgs.callPackage ../devanagari {};
timer = pkgs.writers.writeDashBin "timer" ''
[ $# -eq 2 ] || {
echo "Usage: $0 TIME MESSAGE" 1>&2
exit 1
}
time=$(echo "$1" | ${pkgs.bc}/bin/bc)
echo "sleeping $time seconds, then saying: $2"
${pkgs.coreutils}/bin/sleep "$time" && {
echo "$2" | ${pkgs.espeak}/bin/espeak -v german-mbrola-6
}
'';
manual-sort = pkgs.writers.writeHaskellBin "manual-sort" {} ''
{-# LANGUAGE LambdaCase #-}
import Data.Char (toLower)
@@ -391,16 +421,19 @@ in rec {
'';
nix-index-update = pkgs.writers.writeDashBin "nix-index-update" ''
mkdir -p $HOME/.cache/nix-index
tag=$(git -c 'versionsort.suffix=-' \
ls-remote \
--exit-code \
--refs \
--tags \
--sort='v:refname' \
https://github.com/Mic92/nix-index-database \
| awk 'END {match($2, /([^/]+)$/, m); print m[0]}')
curl -L "https://github.com/Mic92/nix-index-database/releases/download/$tag/files" -o $XDG_RUNTIME_DIR/files-$tag
mv $XDG_RUNTIME_DIR/files-$tag $HOME/.cache/nix-index/files
filename="index-x86_64-$(uname | tr A-Z a-z)"
mkdir -p ~/.cache/nix-index
cd ~/.cache/nix-index
# -N will only download a new version if there is an update.
${pkgs.wget}/bin/wget -q -N https://github.com/Mic92/nix-index-database/releases/latest/download/$filename
ln -f $filename files
'';
} // nur
} // {
devour = pkgs.callPackage <niveum/packages/devour.nix> { };
depp = pkgs.callPackage <niveum/packages/depp.nix> { };
text2pdf = pkgs.callPackage <niveum/packages/text2pdf.nix> { };
vimv = pkgs.callPackage <niveum/packages/vimv.nix> { };
when = pkgs.callPackage <niveum/packages/when.nix> { };
mahlzeit = pkgs.haskellPackages.callPackage <niveum/packages/mahlzeit.nix> { };
inherit opustags;
}

View File

@@ -15,7 +15,7 @@ twoscreen() { # If multi-monitor is selected and there are two screens.
# Mirror displays using native resolution of external display and a scaled
# version for the internal display
if [ "$mirror" = "yes" ]; then
external=$(echo "$screens" | dmenu -i -p "Optimize resolution for:")
external=$(echo "$screens" | dmenu -i -p "Optimize resolution for")
internal=$(echo "$screens" | grep -v "$external")
res_external=$(xrandr --query | sed -n "/^$external/,/\+/p" | \
@@ -38,7 +38,7 @@ twoscreen() { # If multi-monitor is selected and there are two screens.
else
primary=$(echo "$screens" | dmenu -i -p "Select primary display:")
primary=$(echo "$screens" | dmenu -i -p "Select primary display")
secondary=$(echo "$screens" | grep -v "$primary")
direction=$(query_direction | dmenu -i -p "What side of $primary should $secondary be on?")
xrandr --output "$primary" --auto --scale 1.0x1.0 --output "$secondary" --"$direction" "$primary" --auto --scale 1.0x1.0

View File

@@ -28,6 +28,14 @@ python-versions = "*"
[package.dependencies]
pyswisseph = "2.08.00-1"
[[package]]
name = "numpy"
version = "1.21.1"
description = "NumPy is the fundamental package for array computing with Python."
category = "main"
optional = false
python-versions = ">=3.7"
[[package]]
name = "pyswisseph"
version = "2.08.00-1"
@@ -36,10 +44,32 @@ category = "main"
optional = false
python-versions = "*"
[[package]]
name = "pytz"
version = "2021.3"
description = "World timezone definitions, modern and historical"
category = "main"
optional = false
python-versions = "*"
[[package]]
name = "timezonefinder"
version = "5.2.0"
description = "fast python package for finding the timezone of any point on earth (coordinates) offline"
category = "main"
optional = false
python-versions = ">=3.6"
[package.dependencies]
numpy = ">=1.16"
[package.extras]
numba = ["numba (>=0.48)"]
[metadata]
lock-version = "1.1"
python-versions = "^3.8"
content-hash = "2f40aecf583ff9e4f7b2dcc090fee27915e64ff1f8a450fbe5e6f95e8c487d75"
content-hash = "657742383232643f2fa13df5686de0cc79c624f9ae9bdb2f0fc96c7a94b5b8bf"
[metadata.files]
click = [
@@ -54,6 +84,44 @@ flatlib = [
{file = "flatlib-0.2.3-py3-none-any.whl", hash = "sha256:c846d83c965db7588581bb65ac9a6668b9a190afcad5027269f7e9c75f467bcd"},
{file = "flatlib-0.2.3.tar.gz", hash = "sha256:46cc956b936aa31a96082cff23448a5c27dd6e5e434a6293bc9265336c00dd5d"},
]
numpy = [
{file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"},
{file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a"},
{file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062"},
{file = "numpy-1.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1"},
{file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671"},
{file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e"},
{file = "numpy-1.21.1-cp37-cp37m-win32.whl", hash = "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172"},
{file = "numpy-1.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8"},
{file = "numpy-1.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16"},
{file = "numpy-1.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267"},
{file = "numpy-1.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6"},
{file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63"},
{file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af"},
{file = "numpy-1.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5"},
{file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68"},
{file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8"},
{file = "numpy-1.21.1-cp38-cp38-win32.whl", hash = "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd"},
{file = "numpy-1.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214"},
{file = "numpy-1.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f"},
{file = "numpy-1.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b"},
{file = "numpy-1.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac"},
{file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1"},
{file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1"},
{file = "numpy-1.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a"},
{file = "numpy-1.21.1-cp39-cp39-win32.whl", hash = "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2"},
{file = "numpy-1.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33"},
{file = "numpy-1.21.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4"},
{file = "numpy-1.21.1.zip", hash = "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd"},
]
pyswisseph = [
{file = "pyswisseph-2.08.00-1.tar.gz", hash = "sha256:6b4818c0224d309c0b01f3c52df2432900dddcde345364408d99eafc9cdd1e71"},
]
pytz = [
{file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"},
{file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
]
timezonefinder = [
{file = "timezonefinder-5.2.0-py36.py37.py38-none-any.whl", hash = "sha256:4545533086eb25cd7ba10b97785059acbababf4577ab1b4d5c2ab56642eadfea"},
{file = "timezonefinder-5.2.0.tar.gz", hash = "sha256:a374570295a8dbd923630ce85f754e52578e288cb0a9cf575834415e84758352"},
]

View File

@@ -8,9 +8,13 @@ authors = ["Kierán Meinhardt <kmein@posteo.de>"]
python = "^3.8"
flatlib = "^0.2.3"
click = "^8.0.3"
timezonefinder = "^5.2.0"
pytz = "^2021.3"
[tool.poetry.scripts]
horoscope = "horoscope:main"
transits-current = "transits:current"
transits-forecast = "transits:forecast"
[build-system]
requires = ["poetry-core>=1.0.0"]

View File

@@ -0,0 +1,181 @@
from flatlib import aspects, const
from flatlib.chart import Chart
from flatlib.datetime import Datetime
import pytz
from flatlib.geopos import GeoPos
import timezonefinder
import operator
import click
import itertools
from datetime import datetime, timedelta
tf = timezonefinder.TimezoneFinder()
planets = [
const.SUN,
const.MOON,
const.MERCURY,
const.VENUS,
const.MARS,
const.JUPITER,
const.SATURN,
const.URANUS,
const.NEPTUNE,
const.PLUTO,
]
planet_symbols = {
const.SUN: "",
const.MOON: "",
const.MERCURY: "",
const.VENUS: "",
const.MARS: "",
const.JUPITER: "",
const.SATURN: "",
const.URANUS: "",
const.NEPTUNE: "",
const.PLUTO: "",
}
aspect_symbols = {
const.NO_ASPECT: " ",
const.CONJUNCTION: "",
const.SEXTILE: "",
const.SQUARE: "",
const.TRINE: "",
const.OPPOSITION: "",
}
def convert_into_stupid_flatlib_format(dt):
return Datetime(
dt.strftime("%Y/%m/%d"),
dt.strftime("%H:%M"),
dt.utcoffset().total_seconds() / 3600,
)
here_latitude = 52.52
here_longitude = 13.4
def get_aspects(chart1, chart2, *, threshold):
for planet1 in chart1.objects:
for planet2 in chart2.objects:
aspect = aspects.getAspect(planet1, planet2, const.MAJOR_ASPECTS)
if aspect.exists() and aspect.orb <= threshold:
yield aspect
def get_chart(position, dt_naive):
timezone = pytz.timezone(tf.timezone_at(lat=position.lat, lng=position.lon))
dt_aware = timezone.localize(dt_naive)
return Chart(convert_into_stupid_flatlib_format(dt_aware), position, IDs=planets)
def show_aspect(aspect):
return " ".join(
[
planet_symbols[aspect.active.id],
aspect_symbols[aspect.type],
planet_symbols[aspect.passive.id],
]
)
@click.command()
@click.option("--natal-latitude", type=click.FLOAT, default=here_latitude)
@click.option("--natal-longitude", type=click.FLOAT, default=here_longitude)
@click.option("--natal-date", type=click.DateTime(), default=datetime.now())
@click.option("--transit-latitude", type=click.FLOAT, default=here_latitude)
@click.option("--transit-longitude", type=click.FLOAT, default=here_longitude)
@click.option("--transit-date", type=click.DateTime(), default=datetime.now())
@click.option("--threshold", type=click.FLOAT, default=5)
def forecast(
natal_latitude: float,
natal_longitude: float,
natal_date: datetime,
transit_latitude: float,
transit_longitude: float,
transit_date: datetime,
threshold: float,
):
transit_position = GeoPos(transit_latitude, transit_longitude)
natal_position = GeoPos(natal_latitude, natal_longitude)
natal_chart = get_chart(natal_position, natal_date)
transit_chart = get_chart(transit_position, transit_date)
offset = 0
previous_aspects = set(
show_aspect(a)
for a in get_aspects(natal_chart, transit_chart, threshold=threshold)
)
while True:
then = transit_date + timedelta(minutes=offset)
current_chart = get_chart(transit_position, then)
current_aspects = set(
show_aspect(a)
for a in get_aspects(natal_chart, current_chart, threshold=threshold)
)
entered = current_aspects - previous_aspects
exited = previous_aspects - current_aspects
if entered or exited:
print(
then.strftime("%Y-%m-%d %H:%M"),
"".join([" | +" + a for a in entered] + [" | -" + a for a in exited]),
sep="",
)
previous_aspects = current_aspects
offset += 1
@click.command()
@click.option("--natal-latitude", type=click.FLOAT, default=here_latitude)
@click.option("--natal-longitude", type=click.FLOAT, default=here_longitude)
@click.option("--natal-date", "-D", type=click.DateTime(), default=datetime.now())
@click.option("--transit-latitude", type=click.FLOAT, default=here_latitude)
@click.option("--transit-longitude", type=click.FLOAT, default=here_longitude)
@click.option("--transit-date", "-d", type=click.DateTime(), default=datetime.now())
@click.option("--threshold", "-t", type=click.FLOAT, default=5)
def current(
natal_latitude: float,
natal_longitude: float,
natal_date: datetime,
transit_latitude: float,
transit_longitude: float,
transit_date: datetime,
threshold: float,
):
transit_position = GeoPos(transit_latitude, transit_longitude)
natal_position = GeoPos(natal_latitude, natal_longitude)
natal_chart = get_chart(natal_position, natal_date)
transit_chart = get_chart(transit_position, transit_date)
relevant_aspects = list(
get_aspects(natal_chart, transit_chart, threshold=threshold)
)
def aspect_switch_date(aspect, *, direction=1, threshold):
offset = 0
while True:
then = transit_date + direction * timedelta(days=offset)
current_chart = get_chart(transit_position, then)
aspects = [
show_aspect(a)
for a in get_aspects(natal_chart, current_chart, threshold=threshold)
]
if aspect not in aspects:
return then.date()
offset += 1
for aspect in sorted(relevant_aspects, key=operator.attrgetter("orb")):
aspect_string = show_aspect(aspect)
print(
aspect_switch_date(
aspect_string, direction=-1, threshold=threshold
).isoformat(),
aspect_switch_date(
aspect_string, direction=1, threshold=threshold
).isoformat(),
aspect_string,
)

View File

@@ -51,6 +51,10 @@ pkgs.writers.writeDashBin "pls" ''
${pkgs.curl}/bin/curl -sS -XPOST "${playlistAPI}/skip"
echo ${lib.escapeShellArg (lib.concatStringsSep "\n" messages.bad)} | shuf -n1 | ${sendIRC}
;;
say|msg)
shift
echo "$@" | ${sendIRC}
;;
recent)
${pkgs.curl}/bin/curl -sS -XGET "${playlistAPI}/recent" | tac | head
;;

View File

@@ -1,47 +1,65 @@
{ lib, fetchurl, writeText, writers, coreutils, dmenu, gnused, libnotify, xclip, xdotool }:
{ lib, runCommand, fetchurl, writeText, writers, coreutils, dmenu, gnused, libnotify, xclip, xdotool, gawk }:
let
emoji-file = fetchurl {
url = "https://raw.githubusercontent.com/kmein/unipicker/master/symbols";
sha256 = "1q6ampv4fhdvd0riz4ihx43gkbyvdab4c38q96ybn0ka9d30vi3g";
};
unicode-file = runCommand "unicode.txt" {} ''
${writers.writePython3 "generate.py" { flakeIgnore = [ "E501" "E722" ]; } ''
import csv
with open("${fetchurl {
url = "https://unicode.org/Public/UCD/latest/ucd/UnicodeData.txt";
sha256 = "sha256-NgGOaGV/3LNIX2NmMP/oyFMuAcl3cD0oA/W4nWxf6vs=";
}}", "r") as unicode_data:
reader = csv.reader(unicode_data, delimiter=";")
next(reader) # skip first row containing \0
for row in reader:
codepoint = row[0]
name = row[1]
alternate_name = row[10]
try:
print(chr(int(codepoint, 16)), codepoint, name, alternate_name, sep=" ")
except:
continue
''} > $out
'';
kaomoji-file = writeText "kaomoji.txt" ''
¯\(°_o)/¯ dunno lol shrug dlol
¯\_()_/¯ dunno lol shrug dlol
( ͡° ͜ʖ ͡°) lenny
¯\_( ͡° ͜ʖ ͡°)_/¯ lenny shrug dlol
( д) aaah sad noo
(^o^)丿 hi yay hello
(^o^: ups hehe
(^^) yay
(´) angry argh
(^_^) byebye!! bye
<(^.^<) <(^.^)> (>^.^)> (7^.^)7 (>^.^<) dance
(-.-)Zzz... sleep
() oh noes woot
(°°  table flip
() why woot
(___) gloom I see you
    sad
(\/) (°,,,,°) (\/) krebs
 (ل͜) putting table back
 \(°°)/   flip all dem tablez
(`ω´) bear look
(ل͜) strong flex muscle bicep
(ò_óˇ) strong flex muscle bicep
(><) excite
( ` -´).* wizard spell magic
   puss in boots big eye
̯̫̯̫(ˆ̮ ̮ˆ) nyan cat
ʕʔ bear
(ԾɷԾ) adventure time
() happy yay
() happy yay
(º  º )/ panic
¯\(°_o)/¯ dunno lol shrug dlol
¯\_()_/¯ dunno lol shrug dlol
( ͡° ͜ʖ ͡°) lenny
¯\_( ͡° ͜ʖ ͡°)_/¯ lenny shrug dlol
( д) aaah sad noo
(^o^)丿 hi yay hello
(^o^: ups hehe
(^^) yay
(´) angry argh
(^_^) byebye!! bye
<(^.^<) <(^.^)> (>^.^)> (7^.^)7 (>^.^<) dance
(-.-)Zzz... sleep
() oh noes woot
(°° table flip
() why woot
(___) gloom I see you
sad
(\/) (°,,,,°) (\/) krebs
(ل͜) putting table back
\(°°)/ flip all dem tablez
(`ω´) bear look
(ل͜) strong flex muscle bicep
(ò_óˇ) strong flex muscle bicep
(><) excite
( ` -´).* wizard spell magic
puss in boots big eye
̯̫̯̫(ˆ̮ ̮ˆ) nyan cat
ʕʔ bear
(ԾɷԾ) adventure time
() happy yay
() happy yay
(º º )/ panic
𓂺 penis
𓂸 penis
'';
in # ref https://github.com/LukeSmithxyz/voidrice/blob/9fe6802122f6e0392c7fe20eefd30437771d7f8e/.local/bin/dmenuunicode
writers.writeDashBin "unicodmenu" ''
PATH=${lib.makeBinPath [ coreutils dmenu gnused libnotify xclip xdotool ]}
chosen=$(cat ${emoji-file} ${kaomoji-file} | dmenu -i -l 10 | sed "s/ .*//")
chosen=$(cat ${kaomoji-file} ${unicode-file} | dmenu -p unicode -i -l 10 | sed "s/ .*//")
[ "$chosen" != "" ] || exit

22
packages/sncli.nix Normal file
View File

@@ -0,0 +1,22 @@
{ buildPythonPackage, buildPythonApplication, fetchPypi, requests, urwid }:
let
Simperium3 = buildPythonPackage rec {
pname = "Simperium3";
version = "0.1.3";
src = fetchPypi {
inherit pname version;
sha256 = "1j1w4dji39v44l96qq9kbrxpcjkjmika8065gwy8bf847f9fa76p";
};
propagatedBuildInputs = [ requests ];
};
in buildPythonApplication rec {
pname = "sncli";
version = "0.3.0";
src = fetchPypi {
inherit pname version;
sha256 = "18s5a6s2z7k14cbiyfdf98kw92r2hf1xwaavx67dxhadxm18xr4v";
};
propagatedBuildInputs = [ requests urwid Simperium3 ];
}

15
packages/text2pdf.nix Normal file
View File

@@ -0,0 +1,15 @@
{ stdenv, fetchurl }:
stdenv.mkDerivation rec {
name = "${pname}-${version}";
pname = "text2pdf";
version = "1.1";
src = fetchurl {
url = "http://www.eprg.org/pdfcorner/text2pdf/text2pdf.c";
sha256 = "002nyky12vf1paj7az6j6ra7lljwkhqzz238v7fyp7sfgxw0f7d1";
};
phases = [ "buildPhase" ];
buildPhase = ''
mkdir -p $out/bin
gcc -o $out/bin/text2pdf $src
'';
}

Some files were not shown because too many files have changed in this diff Show More