diff options
Diffstat (limited to 'src/spectate/server.rs')
-rw-r--r-- | src/spectate/server.rs | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/spectate/server.rs b/src/spectate/server.rs index ec6fbe5..0c2af1d 100644 --- a/src/spectate/server.rs +++ b/src/spectate/server.rs @@ -38,7 +38,8 @@ pub async fn spectate_server(config: Config, state: Arc<State>) -> Result<()> { win_history: Default::default(), events: broadcast::channel(512).0, }); - spawn(broadcaster(sstate.clone(), state)); + spawn(game_broadcaster(sstate.clone(), state.clone())); + spawn(chat_broadcaster(sstate.clone(), state.clone())); let app = Router::new() .route("/", get(index)) .route("/main.js", get(javascript)) @@ -131,11 +132,19 @@ async fn stats( Json(scoreboard) } -async fn broadcaster(sstate: Arc<SpectateState>, state: Arc<State>) { +async fn chat_broadcaster(sstate: Arc<SpectateState>, state: Arc<State>) { + let mut messages = state.chat.subscribe(); + while let Ok((author, message)) = messages.recv().await { + let p = Packet::Chat(format!("{author}: {message}")); + sstate.past_events.write().await.push(p.clone()); + let _ = sstate.events.send(p); + } +} + +async fn game_broadcaster(sstate: Arc<SpectateState>, state: Arc<State>) { let mut ticks = state.tick.subscribe(); while let Ok(new_game) = ticks.recv().await { let mut events = Vec::new(); - { let g = state.game.read().await; events.push(Packet::Tick); |