matrix-bridge-teams 0.1.0

A bridge between Matrix and Microsoft Teams written in Rust
mod models;
mod oauth;
mod graph_api;
mod message;
mod user;
mod channel;

use std::sync::Arc;
use tokio::sync::RwLock;

use anyhow::Result;
use tracing::info;

use crate::bridge::BridgeCore;
use crate::config::Config;
pub use models::{TeamsAttachment, TeamsChannel, TeamsChat, TeamsMessage, TeamsTeam, TeamsUser};
use oauth::OAuth2Client;

pub struct TeamsClient {
    config: Arc<Config>,
    oauth_client: OAuth2Client,
    bridge: Arc<RwLock<Option<Arc<BridgeCore>>>>,
}

impl TeamsClient {
    pub async fn new(config: Arc<Config>) -> Result<Self> {
        let oauth_client = OAuth2Client::new(&config.auth)?;
        
        Ok(Self {
            config,
            oauth_client,
            bridge: Arc::new(RwLock::new(None)),
        })
    }

    pub async fn set_bridge(&self, bridge: Arc<BridgeCore>) {
        let mut b = self.bridge.write().await;
        *b = Some(bridge);
    }

    pub async fn stop(&self) -> Result<()> {
        Ok(())
    }

    pub async fn authenticate(&self, code: &str) -> Result<()> {
        self.oauth_client.exchange_code_for_token(code).await?;
        info!("Teams authentication successful");
        Ok(())
    }

    pub fn get_auth_url(&self, state: &str) -> Result<String> {
        self.oauth_client.get_authorization_url(state)
    }
}