relay-man 0.2.5

Peer to peer library
Documentation
use bytes_kman::TBytes;

use crate::common::packets::{NewRequestFinal, Packets, RequestFinal};

use super::{ClientStage, Connecting, RelayServer};

impl RelayServer {
    pub(crate) fn on_request_final(&mut self, index: usize, request_final: RequestFinal) {
        let mut to = None;
        for client in self.clients.iter() {
            if let ClientStage::Registered(rclient) = &client.stage {
                if rclient.adress == request_final.to {
                    if rclient
                        .to_connect
                        .contains(&Connecting::Start(request_final.session))
                    {
                        to = Some(client.session)
                    }
                    break;
                }
            } else {
                return;
            }
        }

        let mut from = None;
        if let Some(client) = self.clients.get(index) {
            if let ClientStage::Registered(rclient) = &client.stage {
                from = Some(rclient.adress.clone())
            } else {
                return;
            }
        }

        let Some(from) = from else{return};
        let Some(_) = to else{return};

        let mut session = None;
        for client in self.clients.iter_mut() {
            if let ClientStage::Registered(rclient) = &mut client.stage {
                if rclient.adress == request_final.to {
                    let pak = NewRequestFinal {
                        session: client.session,
                        from,
                        accepted: request_final.accepted,
                    };
                    let mut bytes = Packets::NewRequestFinal(pak).to_bytes();
                    bytes.reverse();
                    let _ = client.conn.send(&bytes);
                    session = Some(client.session);
                    if request_final.accepted {
                        for to_conn in rclient.to_connect.iter_mut() {
                            if to_conn.session() == request_final.session {
                                *to_conn = Connecting::Finishing(
                                    to_conn.session(),
                                    request_final.time_offset,
                                );
                                break;
                            }
                        }
                    } else {
                        rclient
                            .to_connect
                            .retain(|to_conn| to_conn.session() != request_final.session);
                    }
                    break;
                }
            } else {
                return;
            }
        }

        let Some(session) = session else{return};
        if let Some(client) = self.clients.get_mut(index) {
            if let ClientStage::Registered(rclient) = &mut client.stage {
                if request_final.accepted {
                    for to_conn in rclient.to_connect.iter_mut() {
                        if to_conn.session() == session {
                            *to_conn =
                                Connecting::Finishing(to_conn.session(), request_final.time_offset);
                            break;
                        }
                    }
                } else {
                    rclient
                        .to_connect
                        .retain(|to_conn| to_conn.session() != session);
                }
            }
        }
    }
}