{ flake, lib, config, pkgs, ... }: { age.secrets."matrix-mautrix-telegram-env-file" = { file = "${flake.self}/secrets/matrix-mautrix-telegram-env-file.age"; mode = "400"; owner = "matrix-synapse"; }; services.mautrix-telegram = { enable = true; environmentFile = "/run/agenix/matrix-mautrix-telegram-env-file"; settings = { homeserver = { # TODO: Use the port from synapse config address = "http://127.0.0.1:8008"; domain = "pub.solar"; verify_ssl = true; }; appservice = { address = "http://127.0.0.1:8009"; bot_avatar = "mxc://maunium.net/tJCRmUyJDsgRNgqhOgoiHWbX"; bot_displayname = "Telegram bridge bot"; bot_username = "telegrambot"; # TODO: See if we can use postgresql database = "sqlite:////var/lib/mautrix-telegram/sqlite.db"; hostname = "0.0.0.0"; id = "telegram"; max_body_size = 1; port = 8009; provisioning = { enabled = false; prefix = "/_matrix/provision/v1"; shared_secret = "generate"; }; public = { enabled = true; external = "https://matrix.pub.solar/c3c3f34b-29fb-5feb-86e5-98c75ec8214b"; prefix = "/c3c3f34b-29fb-5feb-86e5-98c75ec8214b"; }; }; bridge = { alias_template = "telegram_{groupname}"; allow_matrix_login = true; # Animated stickers conversion requires additional packages in the # service's path. # If this isn't a fresh installation, clearing the bridge's uploaded # file cache might be necessary (make a database backup first!): # delete from telegram_file where \ # mime_type in ('application/gzip', 'application/octet-stream') animated_sticker = { args = { background = "'020202'"; # only for gif, transparency not supported fps = 30; # only for webm height = 256; width = 256; }; target = "gif"; }; bot_messages_as_notices = true; bridge_notices = { default = false; exceptions = []; }; command_prefix = "!tg"; delivery_error_reports = true; delivery_receipts = false; displayname_max_length = 100; displayname_preference = [ "full name" "username" "phone number" ]; displayname_template = "'{displayname} (Telegram)'"; emote_format = "'* $mention $formatted_body'"; encryption = { allow = false; database = "default"; default = false; key_sharing = { allow = false; require_cross_signing = false; require_verification = true; }; }; federate_rooms = true; filter = { list = []; mode = "blacklist"; }; image_as_file_size = 10; initial_power_level_overrides = { group = {}; user = {}; }; inline_images = false; max_document_size = 100; max_initial_member_sync = 10; max_telegram_delete = 10; message_formats = { "m.audio" = "'$sender_displayname sent an audio file: $message'"; "m.emote" = "'* $sender_displayname $message'"; "m.file" = "'$sender_displayname sent a file: $message'"; "m.image" = "'$sender_displayname sent an image: $message'"; "m.location" = "'$sender_displayname sent a location: $message'"; "m.notice" = "'$sender_displayname: $message'"; "m.text" = "'$sender_displayname: $message'"; "m.video" = "'$sender_displayname sent a video: $message'"; }; parallel_file_transfer = false; plaintext_highlights = false; private_chat_portal_meta = false; public_portals = true; relaybot = { authless_portals = true; group_chat_invite = []; ignore_own_incoming_events = true; ignore_unbridged_group_chat = true; private_chat = { invite = []; message = "This is a Matrix bridge relaybot and does not support direct chats"; state_changes = true; }; whitelist = []; whitelist_group_admins = true; }; resend_bridge_info = false; skip_deleted_members = true; startup_sync = true; state_event_formats = { join = "$displayname joined the room."; leave = "$displayname left the room."; name_change = "$prev_displayname changed their name to $displayname"; }; sync_channel_members = false; sync_dialog_limit = 30; sync_direct_chats = false; sync_matrix_state = true; sync_with_custom_puppets = true; telegram_link_preview = true; username_template = "telegram_{userid}"; permissions = { "pub.solar" = "full"; }; }; logging = { formatters= { precise = { format = "[%(asctime)s] [%(levelname)s@%(name)s] %(message)s"; }; }; handlers = { console = { class = "logging.StreamHandler"; formatter = "precise"; }; }; loggers={ aiohttp.level = "WARNING"; mau.level = "WARNING"; telethon.level = "WARNING"; }; root = { handlers = [ "console" ]; level = "WARNING"; }; version = 1; }; telegram = { connection = { flood_sleep_threshold = 60; request_retries = 5; retries = 5; retry_delay = 1; timeout = 120; }; device_info = { app_version = "auto"; device_model = "auto"; lang_code = "en"; system_lang_code = "en"; system_version = "auto"; }; proxy = { address = "127.0.0.1"; password = "''"; port = 1080; rdns = true; type = "disabled"; username = "''"; }; server = { dc = 2; enabled = false; ip = "149.154.167.40"; port = 80; }; }; }; }; systemd.services.mautrix-telegram.path = with pkgs; [ lottieconverter # for animated stickers conversion, unfree package ffmpeg # if converting animated stickers to webm (very slow!) ]; systemd.services.mautrix-telegram.serviceConfig = let cfg = config.services.mautrix-telegram; settingsFormat = pkgs.formats.json {}; settingsFile = settingsFormat.generate "mautrix-telegram-config.json" cfg.settings; in { User = "matrix-synapse"; ExecStart = '' ${pkgs.mautrix-telegram}/bin/mautrix-telegram \ --config='${settingsFile}' --no-update ''; }; }