{ description = "A discord bot that allows users to add and remove themself to roles"; inputs = { utils.url = "github:numtide/flake-utils"; devshell.url = "github:numtide/devshell"; naersk.url = "github:nix-community/naersk"; rust-overlay.url = "github:oxalica/rust-overlay"; }; outputs = { self, nixpkgs, utils, naersk, devshell, rust-overlay, }: utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; overlays = [(import rust-overlay)]; }; rust = pkgs.rust-bin.stable.latest.default.override { extensions = ["rust-src"]; }; # Override naersk to use our chosen rust version from rust-overlay naersk-lib = naersk.lib.${system}.override { cargo = rust; rustc = rust; }; in rec { packages.default = naersk-lib.buildPackage { pname = "rolebot"; root = ./.; }; apps.default = utils.lib.mkApp {drv = packages.default;}; # Provide a dev env with rust and rls devShells.default = let pkgs = import nixpkgs { inherit system; overlays = [devshell.overlays.default]; }; in pkgs.devshell.mkShell { packages = with pkgs; [rust rust-analyzer]; }; formatter = pkgs.alejandra; hydraJobs.build = packages.default; }) // { overlays.default = final: prev: { rolebot = self.packages.${prev.system}.default; }; nixosModules.default = { config, lib, pkgs, ... }: with lib; let cfg = config.services.rolebot; in { options.services.rolebot = { enable = mkEnableOption "Enable the rolebot service"; environmentFile = mkOption { type = types.path; description = "Path to the environment file"; }; }; config = mkIf cfg.enable { nixpkgs.overlays = [self.overlays.default]; systemd.services.rolebot = { description = "Discord role bot"; wantedBy = ["multi-user.target"]; after = ["network-online.target"]; wants = ["network-online.target"]; serviceConfig = { User = "rolebot"; ExecStart = "${pkgs.rolebot}/bin/rolebot"; Restart = "on-failure"; DynamicUser = true; EnvironmentFile = cfg.environmentFile; }; }; }; }; }; }