chat_server/
chat_server.rs

1use std::{collections::HashMap, net::SocketAddr};
2
3use nautilus_sockets::prelude::*;
4
5fn main() {
6    let mut socket =
7        NautSocket::<NautServer>::new("127.0.0.1:8008", ServerConfig::default()).unwrap();
8
9    socket.register_plugin(LoggingPlugin);
10    socket.register_plugin(ChattersPlugin);
11
12
13    loop {
14        // Must be run for every socket
15        socket.poll();
16        socket.run_events();
17    }
18}
19
20#[derive(Default)]
21pub struct Chatters {
22    names: HashMap<ConnectionId, String>,
23}
24
25impl Persistent for Chatters {}
26
27pub struct ChattersPlugin;
28
29impl SocketPlugin<'_, NautServer> for ChattersPlugin {
30    fn register(&self, socket: &mut NautSocket<'_, NautServer>) {
31        socket.init_persistent::<Chatters>();
32
33        socket.on("new_messenger", create_new_chatter);
34        socket.on("send_message", on_send_message);
35
36        socket.on_poll(remove_chatters_on_disconnect);
37    }
38}
39
40fn remove_chatters_on_disconnect(socket: &mut NautSocket<'_, NautServer>) {
41    for event in socket.server().iter_server_events() {
42        match event {
43            ServerEvent::OnClientTimeout(id) | ServerEvent::OnClientDisconnected(id) => {
44                let Some(chatters) = socket.get_persistent::<Chatters>() else {
45                    return;
46                };
47
48                let Ok(mut chatters) = chatters.write() else {
49                    return;
50                };
51
52                chatters.names.remove(id);
53            }
54            _ => {}
55        }
56    }
57}
58
59fn on_send_message(socket: &mut NautSocket<'_, NautServer>, (addr, packet): (SocketAddr, &[u8])) {
60    let Some(id) = socket.server().get_client_id(&addr) else {
61        return;
62    };
63
64    let name = {
65        let Some(chatters) = socket.get_persistent::<Chatters>() else {
66            return;
67        };
68        let Ok(chatters) = chatters.read() else {
69            return;
70        };
71
72        chatters.names.get(id).cloned()
73    };
74
75    let Some(name) = name else {
76        return;
77    };
78
79    let msg = String::from_utf8(packet.to_vec()).unwrap();
80    let string = format!("{}: {}", name, msg);
81    let _ = socket.broadcast("recv_message", string.as_bytes(), PacketDelivery::Reliable);
82}
83
84fn create_new_chatter(
85    socket: &mut NautSocket<'_, NautServer>,
86    (addr, packet): (SocketAddr, &[u8]),
87) {
88    let Some(id) = socket.server().get_client_id(&addr) else {
89        return;
90    };
91
92    let Some(chatters) = socket.get_persistent::<Chatters>() else {
93        return;
94    };
95
96    let name = String::from_utf8(packet.to_vec()).unwrap();
97    {
98        let Ok(mut chatters) = chatters.write() else {
99            return;
100        };
101
102        chatters.names.insert(*id, name.clone());
103    }
104
105    let join_msg = format!("Welcome {name}");
106
107    let _ = socket.broadcast(
108        "recv_message",
109        join_msg.as_bytes(),
110        PacketDelivery::Reliable,
111    );
112}