pub mod prelude {
use std::net::{TcpListener, TcpStream, SocketAddr};
use std::io::prelude::*;
use std::io::BufReader;
use std::thread;
use std::sync::{Arc, Mutex};
#[allow(dead_code)]
pub type SessionType = (TcpStream, SocketAddr);
#[allow(dead_code)]
pub type SessionsType = Arc<Mutex<Vec<SessionType>>>;
pub struct Sessions {}
impl Sessions {
#[allow(dead_code)]
pub fn new() -> SessionsType {
Arc::new(Mutex::new(Vec::new()))
}
}
#[allow(dead_code)]
struct ClientState(String, SocketAddr);
#[allow(dead_code)]
pub struct MudServer {
pub sessions: Sessions,
}
pub trait ServerHandler {
fn start(&self, addr: &str, port: &str) -> TcpListener {
TcpListener::bind(format!("{}:{}", addr, port)).unwrap()
}
fn listen(&self, listener: TcpListener, sessions: SessionsType) {
let mut threads = vec![];
loop {
match listener.accept() {
Ok((stream, addr)) => {
let sessions = Arc::clone(&sessions);
threads.push(thread::spawn(move || {
Self::handle_client(stream, sessions, addr);
}));
}
Err(e) => println!("couldn't get client: {:?}", e),
}
}
}
fn handle_client(stream: TcpStream, sessions: Arc<Mutex<Vec<(TcpStream, SocketAddr)>>>, addr: SocketAddr) {
let client_state = ClientState("".to_string(), addr);
loop {
let mut message = String::new();
let mut reader = BufReader::new(stream.try_clone().unwrap());
match reader.read_line(&mut message) {
Ok(_success) => (),
Err(_e) => {
let mut sessions = sessions.lock().unwrap();
let mut pos_to_remove = 0;
for (pos, session) in sessions.iter().enumerate() {
if session.1 == client_state.1 {
pos_to_remove = pos;
}
}
sessions.remove(pos_to_remove);
return
}
}
Self::handle_message(&message, &addr.to_string());
}
}
#[allow(unused_variables)]
fn handle_message(message: &str, address: &str);
}
}