diff --git a/nix/default.nix b/nix/default.nix new file mode 100644 index 0000000..b07d863 --- /dev/null +++ b/nix/default.nix @@ -0,0 +1,21 @@ +{ pkgs ? ( + let + inherit (builtins) fetchTree fromJSON readFile; + inherit ((fromJSON (readFile ./flake.lock)).nodes) nixpkgs gomod2nix; + in + import (fetchTree nixpkgs.locked) { + overlays = [ + (import "${fetchTree gomod2nix.locked}/overlay.nix") + ]; + } +) +, buildGoApplication ? pkgs.buildGoApplication +}: + +buildGoApplication { + pname = "discord-tweeter"; + version = "0.1"; + pwd = ./.; + src = ../.; + modules = ./gomod2nix.toml; +} diff --git a/nix/flake.lock b/nix/flake.lock new file mode 100644 index 0000000..a0e83ed --- /dev/null +++ b/nix/flake.lock @@ -0,0 +1,85 @@ +{ + "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" + } + }, + "gomod2nix": { + "inputs": { + "flake-utils": [ + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1742209644, + "narHash": "sha256-jMy1XqXqD0/tJprEbUmKilTkvbDY/C0ZGSsJJH4TNCE=", + "owner": "nix-community", + "repo": "gomod2nix", + "rev": "8f3534eb8f6c5c3fce799376dc3b91bae6b11884", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "gomod2nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1742288794, + "narHash": "sha256-Txwa5uO+qpQXrNG4eumPSD+hHzzYi/CdaM80M9XRLCo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b6eaf97c6960d97350c584de1b6dcff03c9daf42", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "gomod2nix": "gomod2nix", + "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 +} diff --git a/nix/flake.nix b/nix/flake.nix new file mode 100644 index 0000000..80ad039 --- /dev/null +++ b/nix/flake.nix @@ -0,0 +1,24 @@ +{ + description = "NixOS flake for discord-tweeter"; + + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.gomod2nix.url = "github:nix-community/gomod2nix"; + inputs.gomod2nix.inputs.nixpkgs.follows = "nixpkgs"; + inputs.gomod2nix.inputs.flake-utils.follows = "flake-utils"; + + outputs = { self, nixpkgs, flake-utils, gomod2nix }: + (flake-utils.lib.eachDefaultSystem + (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + + callPackage = pkgs.darwin.apple_sdk_11_0.callPackage or pkgs.callPackage; + in + { + nixosModules.default = callPackage ./services.nix { inherit self; }; + packages.default = callPackage ./. { inherit (gomod2nix.legacyPackages.${system}) buildGoApplication; }; + devShells.default = callPackage ./shell.nix { inherit (gomod2nix.legacyPackages.${system}) mkGoEnv gomod2nix; }; + }) + ); +} diff --git a/nix/gomod2nix.toml b/nix/gomod2nix.toml new file mode 100644 index 0000000..5edd8c3 --- /dev/null +++ b/nix/gomod2nix.toml @@ -0,0 +1,21 @@ +schema = 3 + +[mod] + [mod."github.com/AlexEidt/Vidio"] + version = "v1.5.1" + hash = "sha256-WdnCYjxbFqDmh/IVaVCCc1TzvklKdJtDMdIgn6m6NTM=" + [mod."github.com/BurntSushi/toml"] + version = "v1.5.0" + hash = "sha256-wX8bEVo7swuuAlm0awTIiV1KNCAXnm7Epzwl+wzyqhw=" + [mod."github.com/imperatrona/twitter-scraper"] + version = "v0.0.16" + hash = "sha256-nbv9fI6/3OxnC8NaLO82UfcwbJMz1jxvfNjZPOrILzM=" + [mod."github.com/jmoiron/sqlx"] + version = "v1.4.0" + hash = "sha256-0H132+A983nBr2zEyCKsJoBCZlC9pG+ylEcGysxKL4M=" + [mod."github.com/mattn/go-sqlite3"] + version = "v1.14.24" + hash = "sha256-taGKFZFQlR5++5b2oZ1dYS3RERKv6yh1gniNWhb4egg=" + [mod."golang.org/x/net"] + version = "v0.37.0" + hash = "sha256-sZKbJISVdBwyuYRQgrraTKxeIORWlzK5hScceQ2dE58=" diff --git a/nix/services.nix b/nix/services.nix new file mode 100644 index 0000000..6658611 --- /dev/null +++ b/nix/services.nix @@ -0,0 +1,51 @@ +{config, lib, pkgs, ...}: + +with lib; + +let + cfg = config.services.discord-tweeter; + + format = pkgs.formats.toml { }; + configFile = format.generate "config.toml" cfg.settings; +in +{ + options.services.discord-tweeter = { + enable = mkEnableOption (lib.mdDoc "discord-tweeter"); + + settings = mkOption { + type = format.type; + default = { + username = ""; + password = ""; + proxyaddr = ""; + webhook = ""; + DbPath = "/var/lib/discord-tweeter/"; + CookiePath = "/var/lib/discord-tweeter/"; + channels = [ ]; + filter = [ 0b11111 ]; + UseWebServer = true; + HostURL = ""; + WebPort = 8080; + UserAgents = [ "discordbot" "curl" "httpie" "lwp-request" "wget" "python-requests" "openbsd ftp" "powershell" ]; + NitterBase = "https://xcancel.com"; + }; + description = lib.mdDoc '' + ''; + }; + }; + + config = mkIf cfg.enable { + systemd.services.discord-tweeter = { + description = "Send tweets to Discord by scraping Twitter (now X)"; + after = [ "network.target" ]; + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + DynamicUser = true; + ExecStart = "${self.packages.${pkgs.system}.default}/bin/discord-tweeter ${configFile}"; + Restart = "on-failure"; + }; + }; + }; +} + diff --git a/nix/shell.nix b/nix/shell.nix new file mode 100644 index 0000000..8d806a2 --- /dev/null +++ b/nix/shell.nix @@ -0,0 +1,24 @@ +{ pkgs ? ( + let + inherit (builtins) fetchTree fromJSON readFile; + inherit ((fromJSON (readFile ./flake.lock)).nodes) nixpkgs gomod2nix; + in + import (fetchTree nixpkgs.locked) { + overlays = [ + (import "${fetchTree gomod2nix.locked}/overlay.nix") + ]; + } + ) +, mkGoEnv ? pkgs.mkGoEnv +, gomod2nix ? pkgs.gomod2nix +}: + +let + goEnv = mkGoEnv { pwd = ../.; }; +in +pkgs.mkShell { + packages = [ + goEnv + gomod2nix + ]; +}