phoebe/src/bridgers.rs

64 lines
2.1 KiB
Rust

use std::{cell::RefCell, str::FromStr, sync::Mutex};
use crate::{
discord::{self, forward_to_discord},
matrix::{self, forward_to_matrix},
messages::{MessageReference, SentMessage},
};
pub struct Bridgers {
pub discord: Mutex<RefCell<Option<discord::Context>>>,
pub matrix: Mutex<RefCell<Option<matrix::Client>>>,
}
impl Bridgers {
pub fn new() -> Self {
Self {
discord: Mutex::new(RefCell::new(None)),
matrix: Mutex::new(RefCell::new(None)),
}
}
fn get_linked_discord_channel(&self, source: &MessageReference) -> Option<discord::ChannelId> {
match source {
MessageReference::Matrix(_room_id, _event_id) => {
// TODO: Look up the linked channel
Some(discord::ChannelId(885690775193661463))
}
_ => None,
}
}
fn get_linked_matrix_room(&self, source: &MessageReference) -> Option<matrix::RoomId> {
match source {
MessageReference::Discord(_, _) => {
// TODO: Look up the linked channel
Some(matrix::RoomId::from_str("!SjQatGOikRshcWNcln:matrix.org").unwrap())
}
_ => None,
}
}
pub async fn send_message(&self, message: SentMessage) -> Vec<MessageReference> {
let mut created_messages = Vec::new();
if let Some(discord) = self.discord.lock().unwrap().borrow().as_ref() {
if let Some(channel) = self.get_linked_discord_channel(&message.source) {
if let Some(m) = forward_to_discord(discord, channel, &message).await {
created_messages.push(m);
}
}
}
if let Some(matrix) = self.matrix.lock().unwrap().borrow().as_ref() {
if let Some(room_id) = self.get_linked_matrix_room(&message.source) {
if let Some(m) = forward_to_matrix(matrix, room_id, &message).await {
created_messages.push(m);
}
}
}
created_messages
}
}