mirror of
https://github.com/nix-community/home-manager.git
synced 2025-11-08 19:46:05 +01:00
I did not want to break any current configurations, and as it seems that senpai doesn't rely on any of the patterns that weren't possible with the old toSCFG generator.
137 lines
4.2 KiB
Nix
137 lines
4.2 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
let
|
|
inherit (lib) mkOption types;
|
|
|
|
cfg = config.programs.senpai;
|
|
in
|
|
{
|
|
options.programs.senpai = {
|
|
enable = lib.mkEnableOption "senpai";
|
|
package = lib.mkPackageOption pkgs "senpai" { };
|
|
config = mkOption {
|
|
type = types.submodule {
|
|
freeformType = types.attrsOf types.anything;
|
|
options = {
|
|
address = mkOption {
|
|
type = types.str;
|
|
description = ''
|
|
The address (`host[:port]`) of the IRC server. senpai uses TLS
|
|
connections by default unless you specify tls option to be false.
|
|
TLS connections default to port 6697, plain-text use port 6667.
|
|
|
|
UR`ircs://`, `irc://`, and `irc+insecure://` URLs are supported,
|
|
in which case only the hostname and port parts will be used. If
|
|
the scheme is `ircs/irc+insecure`, tls will be overriden and set
|
|
to true/false accordingly.
|
|
'';
|
|
};
|
|
|
|
nickname = mkOption {
|
|
type = types.str;
|
|
description = ''
|
|
Your nickname, sent with a NICK IRC message. It mustn't contain
|
|
spaces or colons (:).
|
|
'';
|
|
};
|
|
|
|
password = mkOption {
|
|
type = types.nullOr types.str;
|
|
default = null;
|
|
description = ''
|
|
Your password, used for SASL authentication. Note that it will
|
|
reside world-readable in the Nix store.
|
|
'';
|
|
};
|
|
|
|
password-cmd = mkOption {
|
|
type = types.nullOr (types.listOf types.str);
|
|
default = null;
|
|
example = [
|
|
"gopass"
|
|
"show"
|
|
"irc/guest"
|
|
];
|
|
description = ''
|
|
Alternatively to providing your SASL authentication password
|
|
directly in plaintext, you can specify a command to be run to
|
|
fetch the password at runtime. This is useful if you store your
|
|
passwords in a separate (probably encrypted) file using `gpg` or a
|
|
command line password manager such as `pass` or `gopass`. If a
|
|
password-cmd is provided, the value of password will be ignored
|
|
and the first line of the output of `password-cmd` will be used
|
|
for login.
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
example = lib.literalExpression ''
|
|
{
|
|
address = "libera.chat:6697";
|
|
nickname = "nicholas";
|
|
password = "verysecurepassword";
|
|
}
|
|
'';
|
|
description = ''
|
|
Configuration for senpai. For a complete list of options, see
|
|
{manpage}`senpai(5)`.
|
|
'';
|
|
};
|
|
};
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
assertions = with cfg.config; [
|
|
{
|
|
assertion = !isNull password-cmd -> isNull password;
|
|
message = "senpai: password-cmd overrides password!";
|
|
}
|
|
{
|
|
assertion = !cfg.config ? addr;
|
|
message = "senpai: addr is deprecated, use address instead";
|
|
}
|
|
{
|
|
assertion = !cfg.config ? nick;
|
|
message = "senpai: nick is deprecated, use nickname instead";
|
|
}
|
|
{
|
|
assertion = !cfg.config ? no-tls;
|
|
message = "senpai: no-tls is deprecated, use tls instead";
|
|
}
|
|
];
|
|
home.packages = [ cfg.package ];
|
|
xdg.configFile."senpai/senpai.scfg".text =
|
|
let
|
|
attrsToDirectiveList = lib.mapAttrsToList (
|
|
name: value:
|
|
{
|
|
inherit name;
|
|
}
|
|
// (
|
|
if (builtins.typeOf value != "set") then
|
|
{
|
|
params = lib.toList value;
|
|
}
|
|
else
|
|
let
|
|
children = lib.filterAttrs (n: _: n != "_params") value;
|
|
in
|
|
(
|
|
lib.optionalAttrs (value ? "_params") {
|
|
params = value._params;
|
|
}
|
|
// lib.optionalAttrs (children != { }) {
|
|
children = attrsToDirectiveList children;
|
|
}
|
|
)
|
|
)
|
|
);
|
|
in
|
|
lib.hm.generators.toSCFG { } (attrsToDirectiveList cfg.config);
|
|
};
|
|
|
|
meta.maintainers = [ lib.maintainers.malte-v ];
|
|
}
|