1
0
Fork 0
mirror of https://codeberg.org/demostf/sync.git synced 2026-06-04 00:54:08 +02:00

send initial state to joining clients

This commit is contained in:
Robin Appelman 2017-10-05 23:02:19 +02:00
commit 52be2fd70b

View file

@ -10,7 +10,9 @@ use std::net::SocketAddr;
use mio::Token; use mio::Token;
use mio_websocket::interface::*; use mio_websocket::interface::*;
use std::collections::HashMap; use std::collections::HashMap;
use std::collections::HashSet;
use std::borrow::Borrow; use std::borrow::Borrow;
use std::iter::FromIterator;
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "type")] #[serde(tag = "type")]
@ -27,7 +29,7 @@ enum SyncCommand {
struct Session { struct Session {
owner: Token, owner: Token,
clients: Vec<Token>, clients: HashSet<Token>,
tick: u64, tick: u64,
playing: bool playing: bool
} }
@ -37,7 +39,7 @@ fn handle_command(command: SyncCommand, sessions: &mut HashMap<String, Session>,
SyncCommand::CreateCommand { session } => { SyncCommand::CreateCommand { session } => {
let new_session = Session { let new_session = Session {
owner: client, owner: client,
clients: Vec::new(), clients: HashSet::new(),
playing: false, playing: false,
tick: 0 tick: 0
}; };
@ -45,7 +47,17 @@ fn handle_command(command: SyncCommand, sessions: &mut HashMap<String, Session>,
} }
SyncCommand::JoinCommand { session: session_name } => { SyncCommand::JoinCommand { session: session_name } => {
match sessions.get_mut(&session_name) { match sessions.get_mut(&session_name) {
Some(mut session) => session.clients.push(client), Some(mut session) => {
session.clients.insert(client);
send_to_session(session, &SyncCommand::TickPacket {
tick: session.tick,
session: session_name.clone()
}, ws);
send_to_session(session, &SyncCommand::PlayPacket {
play: session.playing,
session: session_name.clone()
}, ws);
}
None => println!("session {} not found", session_name) None => println!("session {} not found", session_name)
} }
} }
@ -54,16 +66,10 @@ fn handle_command(command: SyncCommand, sessions: &mut HashMap<String, Session>,
Some(mut session) => { Some(mut session) => {
if session.owner == client { if session.owner == client {
session.tick = tick; session.tick = tick;
let command_text = serde_json::to_string(&SyncCommand::TickPacket { send_to_session(session, &SyncCommand::TickPacket {
tick, tick,
session: session_name session: session_name
}).unwrap(); }, ws);
for peer in ws.get_connected().unwrap() {
if peer != client {
let response = WebSocketEvent::TextMessage(command_text.clone());
ws.send((peer, response));
}
}
} }
} }
None => println!("session {} not found", session_name) None => println!("session {} not found", session_name)
@ -74,16 +80,10 @@ fn handle_command(command: SyncCommand, sessions: &mut HashMap<String, Session>,
Some(mut session) => { Some(mut session) => {
if session.owner == client { if session.owner == client {
session.playing = play; session.playing = play;
let command_text = serde_json::to_string(&SyncCommand::PlayPacket { send_to_session(session, &SyncCommand::PlayPacket {
play, play,
session: session_name session: session_name
}).unwrap(); }, ws);
for peer in ws.get_connected().unwrap() {
if peer != client {
let response = WebSocketEvent::TextMessage(command_text.clone());
ws.send((peer, response));
}
}
} }
} }
None => println!("session {} not found", session_name) None => println!("session {} not found", session_name)
@ -92,6 +92,16 @@ fn handle_command(command: SyncCommand, sessions: &mut HashMap<String, Session>,
} }
} }
fn send_to_session(session: &Session, command: &SyncCommand, ws: &mut WebSocket) {
let command_text = serde_json::to_string(command).unwrap();
let all_clients = HashSet::from_iter(ws.get_connected().unwrap());
let peers = &all_clients & &session.clients;
for peer in peers {
let response = WebSocketEvent::TextMessage(command_text.clone());
ws.send((peer, response));
}
}
fn main() { fn main() {
let port = std::env::var("PORT").unwrap_or("80".to_string()); let port = std::env::var("PORT").unwrap_or("80".to_string());
let listen = format!("0.0.0.0:{}", port); let listen = format!("0.0.0.0:{}", port);