mod parser;
mod validator;
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Config {
pub bridge: BridgeConfig,
pub auth: AuthConfig,
pub logging: LoggingConfig,
pub database: DatabaseConfig,
pub room: RoomConfig,
pub channel: ChannelConfig,
pub limits: LimitsConfig,
pub ghosts: GhostsConfig,
pub metrics: MetricsConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BridgeConfig {
pub domain: String,
pub homeserver_url: String,
pub port: u16,
pub bind_address: String,
pub bridge_id: String,
pub appservice_token: String,
pub homeserver_token: String,
pub presence_interval: u64,
pub disable_presence: bool,
pub disable_typing_notifications: bool,
pub disable_deletion_forwarding: bool,
pub disable_portal_bridging: bool,
pub enable_self_service_bridging: bool,
pub disable_read_receipts: bool,
pub disable_join_leave_notifications: bool,
pub disable_invite_notifications: bool,
pub disable_room_topic_notifications: bool,
pub determine_code_language: bool,
pub admin_mxid: String,
pub invalid_token_message: String,
pub user_limit: Option<u32>,
pub user_activity: UserActivityConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserActivityConfig {
pub min_user_active_days: u32,
pub inactive_after_days: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthConfig {
pub tenant_id: String,
pub client_id: String,
pub client_secret: String,
pub redirect_uri: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LoggingConfig {
pub level: String,
pub line_date_format: String,
pub format: String,
pub files: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DatabaseConfig {
pub url: Option<String>,
pub filename: Option<String>,
pub max_connections: Option<u32>,
pub min_connections: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RoomConfig {
pub default_visibility: String,
pub room_alias_prefix: String,
pub enable_room_creation: bool,
pub kick_for: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChannelConfig {
pub name_pattern: String,
pub enable_channel_creation: bool,
pub channel_name_format: String,
pub topic_format: String,
pub delete_options: DeleteOptionsConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeleteOptionsConfig {
pub disable_messaging: bool,
pub unset_room_alias: bool,
pub unlist_from_directory: bool,
pub set_invite_only: bool,
pub ghosts_leave: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LimitsConfig {
pub room_ghost_join_delay: u64,
pub teams_send_delay: u64,
pub room_count: i32,
pub matrix_event_age_limit_ms: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GhostsConfig {
pub nick_pattern: String,
pub username_pattern: String,
pub username_template: String,
pub displayname_template: String,
pub avatar_url_template: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricsConfig {
pub enabled: bool,
pub port: u16,
pub bind_address: String,
}
impl Config {
pub fn load() -> anyhow::Result<Self> {
let config_path = std::env::var("CONFIG_PATH")
.unwrap_or_else(|_| "config/config.yaml".to_string());
parser::parse_config(&PathBuf::from(&config_path))
}
}