chat_client/
chat_client.rs

1use std::{
2    io::stdin,
3    sync::{Arc, RwLock},
4    time::Duration,
5};
6
7use nautilus_sockets::prelude::*;
8
9fn main() {
10    let socket = Arc::new(RwLock::new(
11        NautSocket::<NautClient>::new("127.0.0.1:0").unwrap(),
12    ));
13
14    let mut name: Option<String> = None;
15    {
16        let Ok(mut socket) = socket.write() else {
17            return;
18        };
19
20        socket.connect_to("127.0.0.1:8008").unwrap();
21
22        socket.on("recv_message", |_client, (_addr, bytes)| {
23            let msg = String::from_utf8(bytes.to_vec()).unwrap();
24            println!("{}", msg);
25        });
26    }
27
28    let socket_clone = Arc::clone(&socket);
29    // Separate thread as input blocks
30    std::thread::spawn(move || loop {
31        std::thread::sleep(Duration::from_millis(1));
32
33        let Ok(mut socket) = socket_clone.write() else {
34            continue;
35        };
36
37        // Must be run for every socket
38        socket.poll();
39        socket.run_events();
40    });
41
42    loop {
43        if name.as_ref().is_none() {
44            let mut s = String::new();
45            println!("Enter your name: ");
46            stdin().read_line(&mut s).expect("Invalid string");
47
48            if let Some('\n') = s.chars().next_back() {
49                s.pop();
50            }
51
52            if let Some('\r') = s.chars().next_back() {
53                s.pop();
54            }
55
56            name = Some(s.clone());
57
58            // Get write lock after getting input, shortest time for it in scope
59            let Ok(mut client) = socket.write() else {
60                continue;
61            };
62            let _ = client.send("new_messenger", s.as_bytes(), PacketDelivery::Reliable);
63            continue;
64        }
65
66        let mut s = String::new();
67        stdin().read_line(&mut s).expect("Invalid string");
68
69        if let Some('\n') = s.chars().next_back() {
70            s.pop();
71        }
72
73        if let Some('\r') = s.chars().next_back() {
74            s.pop();
75        }
76
77        // Get write lock after getting input, shortest time for it in scope
78        let Ok(mut client) = socket.write() else {
79            continue;
80        };
81        let _ = client.send("send_message", s.as_bytes(), PacketDelivery::Reliable);
82    }
83}