1use std::{
2 error::Error,
3 net::SocketAddr,
4 time::{SystemTime, UNIX_EPOCH},
5};
6
7use messages::Message;
8use tokio::net::UdpSocket;
9
10pub mod messages;
11
12#[derive(Clone)]
13pub struct Transfer {
14 pub file_haver: SocketAddr,
15 pub file_name: String,
16 pub file_len: u64,
17 pub last_updated: u64,
18}
19
20impl Transfer {
21 pub fn new(file_haver: SocketAddr, file_name: String, file_len: u64) -> Self {
22 let last_updated = SystemTime::now()
23 .duration_since(UNIX_EPOCH)
24 .unwrap()
25 .as_secs();
26 Self {
27 file_haver,
28 file_name,
29 file_len,
30 last_updated,
31 }
32 }
33
34 pub fn update(&mut self) {
35 let last_updated = SystemTime::now()
36 .duration_since(UNIX_EPOCH)
37 .unwrap()
38 .as_secs();
39
40 self.last_updated = last_updated;
41 }
42
43 pub fn has_expired(&self) -> bool {
44 let now = SystemTime::now()
45 .duration_since(UNIX_EPOCH)
46 .unwrap()
47 .as_secs();
48
49 self.last_updated + 10 < now
50 }
51}
52
53pub async fn send_msg<T: Message>(
54 sock: &UdpSocket,
55 msg: &T,
56 target: &SocketAddr,
57) -> Result<(), Box<dyn Error>> {
58 let msg_raw = msg.to_raw();
59 sock.send_to(msg_raw.as_slice(), target).await?;
60 Ok(())
61}