summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlassulus <lassulus@lassul.us>2021-12-30 02:14:35 +0100
committerlassulus <lassulus@lassul.us>2021-12-30 02:14:35 +0100
commitdd565a928a42f870302b3a14eea28eebc575071f (patch)
tree0da020ff32c4ebf735143969814ebb5baea85fae
parent7e67b78596213358e2eb0700313d9c74b8c963ee (diff)
weechat-declarative: init
-rw-r--r--krebs/5pkgs/simple/weechat-declarative/default.nix153
1 files changed, 153 insertions, 0 deletions
diff --git a/krebs/5pkgs/simple/weechat-declarative/default.nix b/krebs/5pkgs/simple/weechat-declarative/default.nix
new file mode 100644
index 000000000..dceb7a8d0
--- /dev/null
+++ b/krebs/5pkgs/simple/weechat-declarative/default.nix
@@ -0,0 +1,153 @@
+{ pkgs, lib, ... }@args:
+
+let
+ # config cannot be declared in the input attribute set because that would
+ # cause callPackage to inject the wrong config. Instead, get it from ...
+ # via args.
+ config = args.config or {};
+
+ lib = args.lib // rec {
+ attrPaths = let
+ recurse = path: value:
+ if builtins.isAttrs value then
+ lib.mapAttrsToList (name: recurse (path ++ [ name ])) value
+ else [ (lib.nameValuePair path value) ];
+ in attrs: lib.flatten (recurse [] attrs);
+
+ attrPathsSep = sep: attrs: lib.listToAttrs (map (x: x // { name = lib.concatStringsSep sep x.name; }) (attrPaths attrs));
+
+ toWeechatValue = x: {
+ bool = builtins.toJSON x;
+ string = x;
+ list = lib.concatMapStringsSep "," toWeechatValue x;
+ int = toString x;
+ }.${builtins.typeOf x};
+
+ setCommand = name: value: "/set ${name} \"${toWeechatValue value}\"";
+
+ filterAddreplace = name: filter:
+ "/filter addreplace ${name} ${filter.buffer} ${lib.concatStringsSep "," filter.tags} ${filter.regex}";
+ };
+
+ cfg = eval.config;
+
+ eval = lib.evalModules {
+ modules = lib.singleton {
+ _file = toString ./weechat-declarative.nix;
+ imports = lib.singleton config;
+ options = {
+ scripts = lib.mkOption {
+ type = lib.types.listOf lib.types.package;
+ default = [];
+ description = ''
+ some stuff from pkgs.weechatScripts
+ '';
+ };
+ settings = lib.mkOption {
+ type = (pkgs.formats.json {}).type;
+ description = ''
+ your weechat config in nix-style syntax.
+ secrets can be defined with \''${my.secret.value}
+ '';
+ default = {};
+ example = {
+ irc.server_default.nicks = "rick_\\\${sec.data.foo}";
+ irc.server_default.msg_part = "ciao kakao";
+ irc.server_default.msg_quit = "tschö mit \\\${sec.data.foo}";
+ irc.look.color_nicks_in_nicklist = true;
+ matrix.server.nibbana = {
+ address = "nibbana.jp";
+ };
+ irc.server.hackint = {
+ address = "irc.hackint.org/6697";
+ ssl = true;
+ autoconnect = true;
+ autojoin = [ "#krebs" ];
+ };
+ weechat.bar.buflist.hidden = true;
+ irc.server.hackint.command = lib.concatStringsSep ";" [
+ "/msg nickserv IDENTIFY \\\${sec.data.hackint_password}"
+ "/msg nickserv SET CLOAK ON"
+ ];
+ filters.playlist_topic = {
+ buffer = "irc.*.#the_playlist";
+ tags = [ "irc_topic" ];
+ regex = "*";
+ };
+ relay = {
+ port.weechat = 9000;
+ network.password = "hunter2";
+ };
+ alias.cmd.mod = "quote omode $channel +o $nick";
+ secure.test.passphrase_command = "echo lol1234123124";
+ };
+ };
+ extraCommands = lib.mkOption {
+ type = lib.types.lines;
+ default = "";
+ };
+ files = lib.mkOption {
+ type = lib.types.attrsOf lib.types.str;
+ default = {};
+ example = lib.literalExpression ''
+ {
+ "sec.conf" = toString (pkgs.writeText "sec.conf" '''
+ [crypt]
+ cipher = aes256
+ hash_algo = sha256
+ passphrase_command = ""
+ salt = on
+
+ [data]
+ __passphrase__ = off
+ foo = "bar"
+ ''');
+ }
+ '';
+ };
+ };
+ };
+ };
+
+ weechat = pkgs.weechat.override {
+ configure = _: {
+ init = lib.optionalString (cfg.settings != {})
+ (lib.concatStringsSep "\n" (
+ lib.optionals
+ (cfg.settings.irc or {} != {})
+ (lib.mapAttrsToList
+ (name: server: "/server add ${name} ${server.address}")
+ cfg.settings.irc.server)
+ ++
+ lib.optionals
+ (cfg.settings.matrix or {} != {})
+ (lib.mapAttrsToList
+ (name: server: "/matrix server add ${name} ${server.address}")
+ cfg.settings.matrix.server)
+ ++
+ lib.mapAttrsToList lib.setCommand (lib.attrPathsSep "." cfg.settings)
+ ++
+ lib.optionals
+ (cfg.settings.filters or {} != {})
+ (lib.mapAttrsToList lib.filterAddreplace cfg.settings.filters)
+ ++
+ lib.singleton cfg.extraCommands
+ ));
+
+ scripts = cfg.scripts;
+ };
+ };
+
+in pkgs.writers.writeDashBin "weechat" ''
+ CONFDIR=''${XDG_CONFIG_HOME:-$HOME/.config}/weechat
+ ${pkgs.coreutils}/bin/mkdir -p "$CONFDIR"
+ ${lib.concatStringsSep "\n"
+ (lib.mapAttrsToList
+ (name: target: /* sh */ ''
+ ${pkgs.coreutils}/bin/ln -s ${lib.escapeShellArg target} "$CONFDIR"/${lib.escapeShellArg name}
+ '')
+ cfg.files
+ )
+ }
+ exec ${weechat}/bin/weechat "$@"
+''