Compare commits
2 Commits
26ae4e9589
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| fda16de4fa | |||
| 2d17c8cdfb |
61
flake.lock
generated
Normal file
61
flake.lock
generated
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731533236,
|
||||||
|
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1766736597,
|
||||||
|
"narHash": "sha256-BASnpCLodmgiVn0M1MU2Pqyoz0aHwar/0qLkp7CjvSQ=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "f560ccec6b1116b22e6ed15f4c510997d99d5852",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-25.11",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
29
flake.nix
Normal file
29
flake.nix
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, flake-utils }:
|
||||||
|
flake-utils.lib.eachDefaultSystem (
|
||||||
|
system:
|
||||||
|
let
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
joann-pupper-bot = pkgs.crystal.buildCrystalPackage {
|
||||||
|
pname = "joann-pupper-bot";
|
||||||
|
version = "0.1.0";
|
||||||
|
src = ./.;
|
||||||
|
lockFile = ./shard.lock;
|
||||||
|
shardsFile = ./shards.nix;
|
||||||
|
format = "shards";
|
||||||
|
buildInputs = [pkgs.sqlite];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
packages = { inherit joann-pupper-bot; };
|
||||||
|
defaultPackage = joann-pupper-bot;
|
||||||
|
}
|
||||||
|
) // {
|
||||||
|
nixosModules.joann-pupper-bot = import ./module.nix;
|
||||||
|
};
|
||||||
|
}
|
||||||
71
module.nix
Normal file
71
module.nix
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
let cfg = config.services.joann-pupper-bot; in {
|
||||||
|
options.services.joann-pupper-bot = {
|
||||||
|
enable = mkEnableOption "Joann's Pupper Bot";
|
||||||
|
user = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "joann-pupper-bot";
|
||||||
|
example = "myuser";
|
||||||
|
description = "Which user should be running Joann's Pupper Bot";
|
||||||
|
};
|
||||||
|
group = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "joann-pupper-bot";
|
||||||
|
example = "mygroup";
|
||||||
|
description = "Which group should be running Joann's Pupper Bot";
|
||||||
|
};
|
||||||
|
stateDir = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "/var/lib/joann-pupper-bot";
|
||||||
|
description = "Which directory the bot should use for storage";
|
||||||
|
};
|
||||||
|
config.token = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "Bot token used for Telegram";
|
||||||
|
};
|
||||||
|
config.subreddits = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
description = "Which subreddits to draw images from";
|
||||||
|
default = ["rarepuppers"];
|
||||||
|
};
|
||||||
|
config.sendCron = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "cron-style string determining when images should be sent";
|
||||||
|
default = "*/30 8-21 * * *";
|
||||||
|
};
|
||||||
|
config.refreshCron = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "cron-style string determining when the bot polls Reddit for new images";
|
||||||
|
default = "*/15 * * * *";
|
||||||
|
};
|
||||||
|
config.recipients = mkOption {
|
||||||
|
type = types.listOf types.int;
|
||||||
|
description = "Telegram chat IDs for each of the image recipients";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
systemd.tmpfiles.rules = [
|
||||||
|
"d '${cfg.stateDir}' 0750 ${cfg.user} ${cfg.group} - -"
|
||||||
|
];
|
||||||
|
systemd.services.joann-pupper-bot = {
|
||||||
|
description = "Joann's Pupper Bot";
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
|
||||||
|
preStart =
|
||||||
|
let
|
||||||
|
yml = generators.toYAML {} cfg.config;
|
||||||
|
configFile = pkgs.writeText "config.yaml" yml;
|
||||||
|
in
|
||||||
|
''
|
||||||
|
cp -f '${configFile}' '${cfg.stateDir}'/config.yaml
|
||||||
|
'';
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = "/bin/sh -c :";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
27
shards.nix
Normal file
27
shards.nix
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"cron_parser" = {
|
||||||
|
url = "https://github.com/kostya/cron_parser.git";
|
||||||
|
rev = "v0.4.0";
|
||||||
|
sha256 = "17fgg2nvyx99v05l10h6cnxfr7swz8yaxhmnk4l47kg2spi8w90a";
|
||||||
|
};
|
||||||
|
"cron_scheduler" = {
|
||||||
|
url = "https://github.com/kostya/cron_scheduler.git";
|
||||||
|
rev = "v0.4.0";
|
||||||
|
sha256 = "0jd0maw1h87hjgjpqhbwxb4yz83g8shlrwfivyf0sd6x3l5lspns";
|
||||||
|
};
|
||||||
|
"db" = {
|
||||||
|
url = "https://github.com/crystal-lang/crystal-db.git";
|
||||||
|
rev = "v0.14.0";
|
||||||
|
sha256 = "1s67fs5abzgg2yyjsm2la967mk881i91h8jdnal072fb9qh9wr58";
|
||||||
|
};
|
||||||
|
"sqlite3" = {
|
||||||
|
url = "https://github.com/crystal-lang/crystal-sqlite3.git";
|
||||||
|
rev = "v0.22.0";
|
||||||
|
sha256 = "1lc8ixnzjx8nsp96qj9yxmfk7g334id8v87g3h5bwgkhkbx5ghqn";
|
||||||
|
};
|
||||||
|
"telepathy" = {
|
||||||
|
url = "https://dev.danilafe.com/Crystal-Bots/telepathy";
|
||||||
|
rev = "v0.2.0";
|
||||||
|
sha256 = "1zhjlpa31vldgd9f6l1hdfj7a97hlqkxkvxzisfs2zfnvc86aiyc";
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user