matrix-bridge-teams 0.1.0

A bridge between Matrix and Microsoft Teams written in Rust
use anyhow::Result;

use crate::matrix::message::MatrixMessage;
use crate::teams::TeamsMessage;

pub struct MessageFlow;

impl MessageFlow {
    pub fn new() -> Self {
        Self
    }

    pub async fn teams_to_matrix(&self, teams_message: TeamsMessage) -> Result<MatrixMessage> {
        Ok(MatrixMessage {
            event_id: format!("$teams_{}", teams_message.id),
            room_id: format!("!teams_{}:localhost", teams_message.channel_id.unwrap_or_default()),
            sender: format!("@teams_{}:localhost", teams_message.sender_id),
            content: crate::matrix::message::MessageContent {
                msgtype: "m.text".to_string(),
                body: teams_message.content.clone(),
                formatted_body: None,
                format: None,
            },
            origin_server_ts: chrono::Utc::now().timestamp_millis() as u64,
        })
    }

    pub async fn matrix_to_teams(&self, matrix_message: MatrixMessage) -> Result<TeamsMessage> {
        Ok(TeamsMessage {
            id: matrix_message.event_id.clone(),
            channel_id: None,
            chat_id: None,
            sender_id: matrix_message.sender.clone(),
            sender_name: String::new(),
            content: matrix_message.content.body.clone(),
            content_type: "text".to_string(),
            attachments: vec![],
            reply_to: None,
            created_at: chrono::Utc::now().to_rfc3339(),
            updated_at: None,
        })
    }

    pub async fn handle_teams_message(&self, message: TeamsMessage) -> Result<()> {
        let matrix_message = self.teams_to_matrix(message).await?;
        Ok(())
    }

    pub async fn handle_matrix_message(&self, message: MatrixMessage) -> Result<()> {
        let teams_message = self.matrix_to_teams(message).await?;
        Ok(())
    }
}