diff --git a/example.toml b/example.toml --- a/example.toml +++ b/example.toml @@ -510,15 +510,6 @@ # Can also be specified via environment variable `TELEGRAM_WEBHOOK_SECRET`. #webhook_secret = -[signal] -# Protocol state is stored in postgres' signal_* tables. -# Link a device via the admin API before enabling. -# -# Can also be specified via environment variable `SIGNAL_ENABLED`. -# -# Default value: false -#enabled = false - [notifications] # Polling interval in milliseconds for the comms queue. # diff --git a/crates/tranquil-config/src/lib.rs b/crates/tranquil-config/src/lib.rs --- a/crates/tranquil-config/src/lib.rs +++ b/crates/tranquil-config/src/lib.rs @@ -142,9 +142,6 @@ pub telegram: TelegramConfig, #[config(nested)] - pub signal: SignalConfig, - - #[config(nested)] pub notifications: NotificationConfig, #[config(nested)] @@ -1069,14 +1066,6 @@ /// Secret token for incoming webhook verification. #[config(env = "TELEGRAM_WEBHOOK_SECRET")] pub webhook_secret: Option, -} - -#[derive(Debug, Config)] -pub struct SignalConfig { - /// Protocol state is stored in postgres' signal_* tables. - /// Link a device via the admin API before enabling. - #[config(env = "SIGNAL_ENABLED", default = false)] - pub enabled: bool, } #[derive(Debug, Config)] diff --git a/crates/tranquil-server/src/main.rs b/crates/tranquil-server/src/main.rs --- a/crates/tranquil-server/src/main.rs +++ b/crates/tranquil-server/src/main.rs @@ -106,19 +106,15 @@ let mut state = AppState::new(shutdown.clone()).await?; - let signal_sender = if tranquil_config::get().signal.enabled { - let slot = Arc::new(tranquil_signal::SignalSlot::default()); - state = state.with_signal_sender(slot.clone()); - if let Some(provider) = &state.signal_store_provider - && let Some(client) = provider.load_signal_client(shutdown.clone()).await - { - slot.set_client(client).await; - info!("Signal device already linked"); - } - Some(SignalSender::new(slot)) - } else { - None - }; + let signal_slot = Arc::new(tranquil_signal::SignalSlot::default()); + state = state.with_signal_sender(signal_slot.clone()); + if let Some(provider) = &state.signal_store_provider + && let Some(client) = provider.load_signal_client(shutdown.clone()).await + { + signal_slot.set_client(client).await; + info!("Signal device linked"); + } + let signal_sender = SignalSender::new(signal_slot); tranquil_sync::listener::start_sequencer_listener(state.clone()).await; @@ -223,10 +219,7 @@ comms_service = comms_service.register_sender(telegram_sender); } - if let Some(sender) = signal_sender { - info!("Signal comms enabled"); - comms_service = comms_service.register_sender(sender); - } + comms_service = comms_service.register_sender(signal_sender); let comms_handle = tokio::spawn(comms_service.run(shutdown.clone())); diff --git a/crates/tranquil-signal/src/client.rs b/crates/tranquil-signal/src/client.rs --- a/crates/tranquil-signal/src/client.rs +++ b/crates/tranquil-signal/src/client.rs @@ -352,7 +352,7 @@ let manager = init_rx .await .ok()? - .map_err(|e| tracing::error!(error = %e, "failed to load registered signal manager")) + .map_err(|e| tracing::debug!(error = %e, "no linked signal device")) .ok()?; Self::from_manager(manager, shutdown) diff --git a/crates/tranquil-api/src/admin/signal.rs b/crates/tranquil-api/src/admin/signal.rs --- a/crates/tranquil-api/src/admin/signal.rs +++ b/crates/tranquil-api/src/admin/signal.rs @@ -9,7 +9,6 @@ #[derive(Serialize)] #[serde(rename_all = "camelCase")] pub struct SignalStatusOutput { - pub enabled: bool, pub linked: bool, } @@ -23,13 +22,12 @@ State(state): State, _auth: Auth, ) -> Result, ApiError> { - let enabled = tranquil_config::get().signal.enabled; let linked = match &state.signal_sender { Some(slot) => slot.is_linked().await, None => false, }; - Ok(Json(SignalStatusOutput { enabled, linked })) + Ok(Json(SignalStatusOutput { linked })) } pub async fn link_signal_device( diff --git a/crates/tranquil-api/src/server/meta.rs b/crates/tranquil-api/src/server/meta.rs --- a/crates/tranquil-api/src/server/meta.rs +++ b/crates/tranquil-api/src/server/meta.rs @@ -5,7 +5,7 @@ use tranquil_pds::state::AppState; use tranquil_pds::util::{discord_app_id, discord_bot_username, telegram_bot_username}; -fn get_available_comms_channels() -> Vec { +async fn get_available_comms_channels(state: &AppState) -> Vec { let cfg = tranquil_config::get(); let mut channels = vec![CommsChannel::Email]; if cfg.discord.bot_token.is_some() { @@ -14,7 +14,9 @@ if cfg.telegram.bot_token.is_some() { channels.push(CommsChannel::Telegram); } - if cfg.signal.enabled { + if let Some(slot) = &state.signal_sender + && slot.is_linked().await + { channels.push(CommsChannel::Signal); } channels @@ -66,7 +68,7 @@ pub telegram_bot_username: Option, } -pub async fn describe_server() -> Json { +pub async fn describe_server(State(state): State) -> Json { let cfg = tranquil_config::get(); let pds_hostname = &cfg.server.hostname; @@ -82,7 +84,7 @@ email: cfg.server.contact_email.clone(), }, version: BUILD_VERSION, - available_comms_channels: get_available_comms_channels(), + available_comms_channels: get_available_comms_channels(&state).await, self_hosted_did_web_enabled: is_self_hosted_did_web_enabled(), discord_bot_username: discord_bot_username().map(String::from), discord_app_id: discord_app_id().map(String::from), diff --git a/frontend/src/components/dashboard/AdminContent.svelte b/frontend/src/components/dashboard/AdminContent.svelte --- a/frontend/src/components/dashboard/AdminContent.svelte +++ b/frontend/src/components/dashboard/AdminContent.svelte @@ -65,7 +65,6 @@ let logoPreview = $state(null) let serverConfigLoading = $state(false) - let signalEnabled = $state(false) let signalLinked = $state(false) let signalQr = $state(null) let signalLoading = $state(false) @@ -236,7 +235,6 @@ if (typeof document !== 'undefined' && document.visibilityState === 'hidden') return try { const status = await api.getSignalStatus(session.accessJwt) - signalEnabled = status.enabled signalLinked = status.linked signalPollErrors = 0 if (signalLinked && signalQr) { @@ -401,33 +399,31 @@ - {#if signalEnabled} -
-
-

{$_('admin.signalIntegration')}

- {#if signalLinked} - {$_('admin.signalLinked')} - {:else if !signalQr} - {$_('admin.signalNotLinked')} - {/if} -
- - {#if signalQr} -
-

{$_('admin.signalLinking')}

- Signal QR -
- {:else if signalLinked} - - {:else} - +
+
+

{$_('admin.signalIntegration')}

+ {#if signalLinked} + {$_('admin.signalLinked')} + {:else if !signalQr} + {$_('admin.signalNotLinked')} {/if} -
- {/if} + + + {#if signalQr} +
+

{$_('admin.signalLinking')}

+ Signal QR +
+ {:else if signalLinked} + + {:else} + + {/if} +
diff --git a/frontend/src/lib/types/api.ts b/frontend/src/lib/types/api.ts --- a/frontend/src/lib/types/api.ts +++ b/frontend/src/lib/types/api.ts @@ -255,7 +255,6 @@ } export interface SignalStatus { - enabled: boolean; linked: boolean; }