chat_server/
chat_server.rs1use 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 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}