phoebe/phoebe-main/src/main.rs

82 lines
2.3 KiB
Rust
Raw Normal View History

2022-04-08 16:52:59 +00:00
use color_eyre::Result;
2022-04-11 11:52:29 +00:00
use tracing::info;
2022-04-08 16:52:59 +00:00
use tracing_subscriber::EnvFilter;
use phoebe::{
get_linked_channels, link_messages,
prelude::{ChatEvent, SqlitePool},
service::Service,
2022-04-16 09:16:51 +00:00
DynServiceLookup,
};
async fn handle_events(
2022-04-16 09:16:51 +00:00
dyn_service: DynServiceLookup,
db: SqlitePool,
mut service: Box<dyn Service + Send + Sync>,
mut rx: tokio::sync::broadcast::Receiver<ChatEvent>,
) {
info!("Handling events for {}…", service.tag());
let mut conn = db
.acquire()
.await
.expect("Failed to acquire core DB connection");
while let Ok(event) = rx.recv().await {
match event {
phoebe::prelude::ChatEvent::NewMessage(message) => {
let linked_channels =
2022-04-16 09:16:51 +00:00
get_linked_channels(&mut conn, dyn_service, &message.origin.channel).await;
let mut resulting_messages = vec![];
for destination_channel in linked_channels {
resulting_messages.extend(
service
.send_chat_message(&message, destination_channel)
.await,
)
}
if let Err(e) = link_messages(&mut conn, &message.origin, &resulting_messages).await
{
tracing::error!("Failed to link messages: {e}");
}
}
}
}
}
2022-04-08 16:52:59 +00:00
#[tokio::main]
async fn main() -> Result<()> {
color_eyre::install()?;
tracing_subscriber::fmt()
.with_target(true)
.with_env_filter(EnvFilter::from_default_env())
.init();
2022-04-11 11:52:29 +00:00
let (tx, _) = tokio::sync::broadcast::channel(512);
2022-04-08 16:52:59 +00:00
let db = phoebe::open_core_db().await?;
2022-04-16 09:16:51 +00:00
fn dyn_service(service: &str) -> &'static str {
match service {
"discord" => "discord",
"matrix" => "matrix",
_ => panic!("Unsupported service: {}", service),
}
}
2022-04-11 11:52:29 +00:00
let services: Vec<Box<dyn Service + Send + Sync>> = vec![Box::new(
2022-04-16 09:16:51 +00:00
phoebe_discord::setup(db.clone(), tx.clone(), dyn_service).await?,
2022-04-08 16:52:59 +00:00
)];
let handles = services
.into_iter()
2022-04-16 09:16:51 +00:00
.map(|srv| tokio::spawn(handle_events(dyn_service, db.clone(), srv, tx.subscribe())));
2022-04-11 11:52:29 +00:00
let _ = futures::future::join_all(handles).await;
2022-04-08 16:52:59 +00:00
Ok(())
}