aboutsummaryrefslogtreecommitdiff
path: root/src/spectate/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/spectate/server.rs')
-rw-r--r--src/spectate/server.rs15
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);