phoebe/src/main.rs

102 lines
2.5 KiB
Rust

use std::sync::Arc;
use discord::create_discord_client;
use matrix::create_matrix_client;
mod bridgers;
mod channels;
mod message_ast;
mod messages;
pub mod discord;
pub mod matrix;
use bridgers::Bridgers;
use tokio::sync::mpsc;
use crate::messages::MessageEvent;
async fn setup_discord(
token: String,
bridgers: Arc<Bridgers>,
discord_tx: mpsc::UnboundedSender<MessageEvent>,
) {
let (discord_ctx_tx, mut discord_ctx_rx) = mpsc::unbounded_channel::<discord::Context>();
tokio::spawn(async move {
let mut discord = create_discord_client(discord_ctx_tx, discord_tx, &token).await;
discord.start().await.unwrap();
});
// Hack to grab the Context object when discord is ready
tokio::spawn(async move {
while let Some(discord) = discord_ctx_rx.recv().await {
bridgers.discord.lock().unwrap().replace(Some(discord));
}
});
}
async fn setup_matrix(
homeserver_url: String,
username: String,
password: String,
bridgers: Arc<Bridgers>,
event_tx: mpsc::UnboundedSender<MessageEvent>,
) {
let client = create_matrix_client(homeserver_url, username, password, event_tx).await;
bridgers
.matrix
.lock()
.unwrap()
.replace(Some(client.clone()));
let settings = matrix_sdk::SyncSettings::default().token(client.sync_token().await.unwrap());
tokio::spawn(async move {
client.sync(settings).await;
});
}
#[tokio::main]
async fn main() {
env_logger::init();
let bridgers = Arc::new(Bridgers::new());
let (event_tx, mut event_rx) = tokio::sync::mpsc::unbounded_channel::<MessageEvent>();
#[inline]
fn get_env_var(key: &str) -> String {
std::env::var(key).expect("DISCORD_TOKEN not set in environment")
}
setup_discord(
get_env_var("DISCORD_TOKEN"),
Arc::clone(&bridgers),
event_tx.clone(),
)
.await;
setup_matrix(
get_env_var("MATRIX_HOMESERVER"),
get_env_var("MATRIX_USERNAME"),
get_env_var("MATRIX_PASSWORD"),
Arc::clone(&bridgers),
event_tx.clone(),
)
.await;
while let Some(event) = event_rx.recv().await {
match event {
MessageEvent::Send(sent_message) => {
let _ = bridgers.send_message(sent_message).await;
}
MessageEvent::Edit(_edited_message) => {
todo!();
}
MessageEvent::AdminLinkChannels(channels) => {
bridgers.link_channels(&channels);
}
}
}
}