1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- use std::collections::HashMap;
- use std::net::TcpListener;
- mod messages;
- #[derive(Debug)]
- struct Player {
- name: String,
- xy: (f32, f32),
- }
- #[derive(Debug)]
- struct State {
- players: HashMap<u16, Player>,
- }
- impl State {
- fn new() -> State {
- let players = HashMap::new();
- State { players }
- }
- fn handle_message(&mut self, msg: messages::Msg) {
- let nonce = msg.nonce;
- match msg.command {
- messages::Command::Hello(name) => {
- let player = Player { name, xy: (0.0, 0.0) };
- self.players.insert(nonce, player);
- }
- messages::Command::Goodbye => {
- self.players.remove(&nonce);
- }
- messages::Command::Update(x, y) => {
- if let Some(p) = self.players.get_mut(&nonce) {
- p.xy = (x, y);
- }
- }
- }
- }
- }
- fn main() {
- let (send, recv) = std::sync::mpsc::channel();
- let udp_send = send.clone();
- std::thread::spawn(move || {
- let listener = TcpListener::bind("0.0.0.0:9991").unwrap();
- loop {
- match listener.accept() {
- Ok((sock, _addr)) => {
- let msg = match messages::Msg::parse(sock) {
- Some(m) => m,
- None => continue,
- };
- send.send(msg).unwrap();
- },
- Err(e) => eprintln!("Problem! {:?}", e),
- }
- }
- });
- std::thread::spawn(move || {
- let socket = std::net::UdpSocket::bind("0.0.0.0:9992").unwrap();
- let mut buf = [0;1024];
- loop {
- let (amt, _) = socket.recv_from(&mut buf).unwrap();
- let msg = messages::Msg::from_slice(&buf[..amt]);
- udp_send.send(msg).unwrap();
- }
- });
- let mut state = State::new();
- while let Ok(msg) = recv.recv() {
- state.handle_message(msg);
- println!("State: {:?}", state);
- }
- }
|