diff --git a/server/src/chat/transport/matrix/bot.rs b/server/src/chat/transport/matrix/bot.rs index d424b57..6bbeaca 100644 --- a/server/src/chat/transport/matrix/bot.rs +++ b/server/src/chat/transport/matrix/bot.rs @@ -217,7 +217,7 @@ pub async fn run_bot( ) -> Result<(), String> { let store_path = project_root.join(".storkit").join("matrix_store"); let client = Client::builder() - .homeserver_url(&config.homeserver) + .homeserver_url(config.homeserver.as_deref().unwrap_or_default()) .sqlite_store(&store_path, None) .build() .await @@ -232,7 +232,10 @@ pub async fn run_bot( let mut login_builder = client .matrix_auth() - .login_username(&config.username, &config.password) + .login_username( + config.username.as_deref().unwrap_or_default(), + config.password.as_deref().unwrap_or_default(), + ) .initial_device_display_name("Storkit Bot"); if let Some(ref device_id) = saved_device_id { @@ -265,8 +268,10 @@ pub async fn run_bot( { use matrix_sdk::ruma::api::client::uiaa; let password_auth = uiaa::AuthData::Password(uiaa::Password::new( - uiaa::UserIdentifier::UserIdOrLocalpart(config.username.clone()), - config.password.clone(), + uiaa::UserIdentifier::UserIdOrLocalpart( + config.username.clone().unwrap_or_default(), + ), + config.password.clone().unwrap_or_default(), )); if let Err(e) = client .encryption() diff --git a/server/src/chat/transport/matrix/config.rs b/server/src/chat/transport/matrix/config.rs index cbfc9eb..0575c98 100644 --- a/server/src/chat/transport/matrix/config.rs +++ b/server/src/chat/transport/matrix/config.rs @@ -13,11 +13,17 @@ fn default_permission_timeout_secs() -> u64 { #[derive(Deserialize, Clone, Debug)] pub struct BotConfig { /// Matrix homeserver URL, e.g. `https://matrix.example.com` - pub homeserver: String, + /// Only required when `transport = "matrix"` (the default). + #[serde(default)] + pub homeserver: Option, /// Bot user ID, e.g. `@storykit:example.com` - pub username: String, + /// Only required when `transport = "matrix"`. + #[serde(default)] + pub username: Option, /// Bot password - pub password: String, + /// Only required when `transport = "matrix"`. + #[serde(default)] + pub password: Option, /// Matrix room IDs to join, e.g. `["!roomid:example.com"]`. /// Use an array for multiple rooms; a single string is accepted via the /// deprecated `room_id` key for backwards compatibility. @@ -227,12 +233,33 @@ impl BotConfig { ); return None; } - } else if config.room_ids.is_empty() { - eprintln!( - "[matrix-bot] bot.toml has no room_ids configured — \ - add `room_ids = [\"!roomid:example.com\"]` to bot.toml" - ); - return None; + } else { + // Default transport is Matrix — validate Matrix-specific fields. + if config.homeserver.as_ref().is_none_or(|s| s.is_empty()) { + eprintln!( + "[bot] bot.toml: transport=\"matrix\" requires homeserver" + ); + return None; + } + if config.username.as_ref().is_none_or(|s| s.is_empty()) { + eprintln!( + "[bot] bot.toml: transport=\"matrix\" requires username" + ); + return None; + } + if config.password.as_ref().is_none_or(|s| s.is_empty()) { + eprintln!( + "[bot] bot.toml: transport=\"matrix\" requires password" + ); + return None; + } + if config.room_ids.is_empty() { + eprintln!( + "[matrix-bot] bot.toml has no room_ids configured — \ + add `room_ids = [\"!roomid:example.com\"]` to bot.toml" + ); + return None; + } } Some(config) } @@ -335,8 +362,8 @@ enabled = true let result = BotConfig::load(tmp.path()); assert!(result.is_some()); let config = result.unwrap(); - assert_eq!(config.homeserver, "https://matrix.example.com"); - assert_eq!(config.username, "@bot:example.com"); + assert_eq!(config.homeserver.as_deref(), Some("https://matrix.example.com")); + assert_eq!(config.username.as_deref(), Some("@bot:example.com")); assert_eq!( config.effective_room_ids(), &["!abc:example.com", "!def:example.com"] diff --git a/server/src/chat/transport/matrix/mod.rs b/server/src/chat/transport/matrix/mod.rs index d0da21e..1f20a84 100644 --- a/server/src/chat/transport/matrix/mod.rs +++ b/server/src/chat/transport/matrix/mod.rs @@ -84,7 +84,7 @@ pub fn spawn_bot( crate::slog!( "[matrix-bot] Starting Matrix bot → homeserver={} rooms={:?}", - config.homeserver, + config.homeserver.as_deref().unwrap_or("(none)"), config.effective_room_ids() );