nix-bitcoin/modules/recurring-donations.nix

108 lines
3.6 KiB
Nix
Raw Normal View History

2019-04-14 09:55:40 -07:00
{ config, lib, pkgs, ... }:
with lib;
let
options.services.recurring-donations = {
enable = mkEnableOption "recurring-donations";
tallycoin = mkOption {
type = types.attrs;
default = {};
description = ''
This option is used to specify tallycoin donation receivers using an
attribute set. For example the following setting instructs the module
to repeatedly send 1000 satoshis to djbooth007.
{
"djbooth007" = 1000;
}
'';
};
interval = mkOption {
type = types.str;
default = "Mon *-*-* 00:00:00";
description = ''
Schedules the donations. Default is weekly on Mon 00:00:00. See `man
systemd.time` for further options.
'';
};
randomizedDelaySec = mkOption {
type = types.int;
default = 86400;
description = ''
Random delay to add to scheduled time for donation. Default is one day.
'';
};
enforceTor = nbLib.enforceTor;
};
2019-04-14 09:55:40 -07:00
cfg = config.services.recurring-donations;
nbLib = config.nix-bitcoin.lib;
2019-04-14 09:55:40 -07:00
recurring-donations-script = pkgs.writeScript "recurring-donations.sh" ''
LNCLI="${config.nix-bitcoin.pkgs.clightning}/bin/lightning-cli --lightning-dir=${config.services.clightning.dataDir}"
2019-04-14 09:55:40 -07:00
pay_tallycoin() {
NAME=$1
AMOUNT=$2
echo "Attempting to pay $AMOUNT sat to $NAME"
2021-08-04 15:49:00 -07:00
INVOICE=$(curl --socks5-hostname ${config.nix-bitcoin.torClientAddressWithPort} -d "satoshi_amount=$AMOUNT&payment_method=ln&id=$NAME&type=profile" -X POST https://api.tallyco.in/v1/payment/request/ | jq -r '.lightning_pay_request') 2> /dev/null
2019-04-14 09:55:40 -07:00
if [ -z "$INVOICE" ] || [ "$INVOICE" = "null" ]; then
echo "ERROR: did not get invoice from tallycoin"
return
fi
# Decode invoice and compare amount with requested amount
DECODED_AMOUNT=$($LNCLI decodepay "$INVOICE" | jq -r '.amount_msat' | head -c -8)
2019-04-14 09:55:40 -07:00
if [ -z "$DECODED_AMOUNT" ] || [ "$DECODED_AMOUNT" = "null" ]; then
echo "ERROR: did not get response from clightning"
return
fi
if [ $DECODED_AMOUNT -eq $AMOUNT ]; then
echo "Paying with invoice $INVOICE"
2019-04-14 09:55:40 -07:00
$LNCLI pay "$INVOICE"
else
echo "ERROR: requested amount and invoice amount do not match. $AMOUNT vs $DECODED_AMOUNT"
2019-04-14 09:55:40 -07:00
return
fi
}
${ builtins.foldl'
(x: receiver: x +
''
pay_tallycoin ${receiver} ${toString (builtins.getAttr receiver cfg.tallycoin)}
'')
""
(builtins.attrNames cfg.tallycoin)
}
'';
in {
inherit options;
2019-04-14 09:55:40 -07:00
config = mkIf cfg.enable {
2020-10-18 05:49:20 -07:00
services.clightning.enable = true;
2020-06-15 03:34:11 -07:00
2019-04-14 09:55:40 -07:00
systemd.services.recurring-donations = {
requires = [ "clightning.service" ];
after = [ "clightning.service" ];
path = with pkgs; [ nix-bitcoin.clightning curl jq ];
serviceConfig = nbLib.defaultHardening // {
2019-04-14 09:55:40 -07:00
ExecStart = "${pkgs.bash}/bin/bash ${recurring-donations-script}";
User = "recurring-donations";
2019-04-14 09:55:40 -07:00
Type = "oneshot";
} // nbLib.allowedIPAddresses cfg.enforceTor;
2019-04-14 09:55:40 -07:00
};
systemd.timers.recurring-donations = {
requires = [ "clightning.service" ];
after = [ "clightning.service" ];
timerConfig = {
Unit = "recurring-donations.service";
OnCalendar = cfg.interval;
RandomizedDelaySec = toString cfg.randomizedDelaySec;
};
wantedBy = [ "multi-user.target" ];
};
users.users.recurring-donations = {
isSystemUser = true;
group = "recurring-donations";
extraGroups = [ config.services.clightning.group ];
};
users.groups.recurring-donations = {};
2019-04-14 09:55:40 -07:00
};
}