2023-02-04 01:01:49 +00:00
|
|
|
//! Domain definitions and implementation of common chat logic.
|
2024-04-21 17:45:50 +00:00
|
|
|
use anyhow::Result;
|
|
|
|
use prometheus::Registry as MetricsRegistry;
|
|
|
|
|
|
|
|
use crate::player::PlayerRegistry;
|
|
|
|
use crate::repo::Storage;
|
|
|
|
use crate::room::RoomRegistry;
|
|
|
|
|
2023-02-04 01:01:49 +00:00
|
|
|
pub mod player;
|
2023-09-30 23:34:35 +00:00
|
|
|
pub mod prelude;
|
2023-07-07 13:09:24 +00:00
|
|
|
pub mod repo;
|
2023-02-04 01:01:49 +00:00
|
|
|
pub mod room;
|
2023-09-30 23:34:35 +00:00
|
|
|
pub mod terminator;
|
2023-09-30 23:12:11 +00:00
|
|
|
|
|
|
|
mod table;
|
2024-04-21 17:45:50 +00:00
|
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct LavinaCore {
|
|
|
|
pub players: PlayerRegistry,
|
|
|
|
pub rooms: RoomRegistry,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl LavinaCore {
|
|
|
|
pub async fn new(mut metrics: MetricsRegistry, storage: Storage) -> Result<LavinaCore> {
|
|
|
|
// TODO shutdown all services in reverse order on error
|
|
|
|
let rooms = RoomRegistry::new(&mut metrics, storage.clone())?;
|
|
|
|
let players = PlayerRegistry::empty(rooms.clone(), storage.clone(), &mut metrics)?;
|
|
|
|
Ok(LavinaCore { players, rooms })
|
|
|
|
}
|
|
|
|
|
|
|
|
pub async fn shutdown(mut self) -> Result<()> {
|
|
|
|
self.players.shutdown_all().await?;
|
|
|
|
drop(self.players);
|
|
|
|
drop(self.rooms);
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|