diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index c97e9f01ad7..72e3c9f23ed 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -672,6 +672,7 @@
./services/networking/syncthing-relay.nix
./services/networking/tcpcrypt.nix
./services/networking/teamspeak3.nix
+ ./services/networking/tedicross.nix
./services/networking/tinc.nix
./services/networking/tinydns.nix
./services/networking/tftpd.nix
diff --git a/nixos/modules/services/networking/tedicross.nix b/nixos/modules/services/networking/tedicross.nix
new file mode 100644
index 00000000000..0716975f594
--- /dev/null
+++ b/nixos/modules/services/networking/tedicross.nix
@@ -0,0 +1,100 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+let
+ dataDir = "/var/lib/tedicross";
+ cfg = config.services.tedicross;
+ configJSON = pkgs.writeText "tedicross-settings.json" (builtins.toJSON cfg.config);
+ configYAML = pkgs.runCommand "tedicross-settings.yaml" { preferLocalBuild = true; } ''
+ ${pkgs.remarshal}/bin/json2yaml -i ${configJSON} -o $out
+ '';
+
+in {
+ options = {
+ services.tedicross = {
+ enable = mkEnableOption "the TediCross Telegram-Discord bridge service";
+
+ config = mkOption {
+ type = types.attrs;
+ # from https://github.com/TediCross/TediCross/blob/master/example.settings.yaml
+ example = literalExample ''
+ {
+ telegram = {
+ useFirstNameInsteadOfUsername = false;
+ colonAfterSenderName = false;
+ skipOldMessages = true;
+ sendEmojiWithStickers = true;
+ };
+ discord = {
+ useNickname = false;
+ skipOldMessages = true;
+ displayTelegramReplies = "embed";
+ replyLength = 100;
+ };
+ bridges = [
+ {
+ name = "Default bridge";
+ direction = "both";
+ telegram = {
+ chatId = -123456789;
+ relayJoinMessages = true;
+ relayLeaveMessages = true;
+ sendUsernames = true;
+ ignoreCommands = true;
+ };
+ discord = {
+ serverId = "DISCORD_SERVER_ID";
+ channelId = "DISCORD_CHANNEL_ID";
+ relayJoinMessages = true;
+ relayLeaveMessages = true;
+ sendUsernames = true;
+ crossDeleteOnTelegram = true;
+ };
+ }
+ ];
+
+ debug = false;
+ }
+ '';
+ description = ''
+ settings.yaml configuration as a Nix attribute set.
+ Secret tokens should be specified using
+ instead of this world-readable file.
+ '';
+ };
+
+ environmentFile = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ description = ''
+ File containing environment variables to be passed to the TediCross service,
+ in which secret tokens can be specified securely using the
+ TELEGRAM_BOT_TOKEN and DISCORD_BOT_TOKEN
+ keys.
+ '';
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ # from https://github.com/TediCross/TediCross/blob/master/guides/autostart/Linux.md
+ systemd.services.tedicross = {
+ description = "TediCross Telegram-Discord bridge service";
+ wantedBy = [ "multi-user.target" ];
+ wants = [ "network-online.target" ];
+ after = [ "network-online.target" ];
+ serviceConfig = {
+ Type = "simple";
+ ExecStart = "${pkgs.nodePackages.tedicross}/bin/tedicross --config='${configYAML}' --data-dir='${dataDir}'";
+ Restart = "always";
+ DynamicUser = true;
+ StateDirectory = baseNameOf dataDir;
+ EnvironmentFile = cfg.environmentFile;
+ };
+ };
+ };
+
+ meta.maintainers = with maintainers; [ pacien ];
+}
+