77 lines
2.5 KiB
Rust
77 lines
2.5 KiB
Rust
extern crate tokio;
|
|
extern crate futures;
|
|
|
|
use tokio::prelude::*;
|
|
use tokio::io;
|
|
use std::iter;
|
|
use std::collections::HashMap;
|
|
use std::io::BufReader;
|
|
use tokio::net::TcpListener;
|
|
use std::sync::{Arc, Mutex};
|
|
|
|
pub mod models;
|
|
pub mod user;
|
|
/*
|
|
struct Context {
|
|
connections: Arc<Mutex<HashMap<,>>>,
|
|
users: Arc<Mutex<HashMap<String,user::User>>>,
|
|
channels: Arc<Mutex<HashMap<String,channel::Channel>>>,
|
|
}
|
|
*/
|
|
fn main() {
|
|
let addr = "127.0.0.1:6667".parse().unwrap();
|
|
let listener = TcpListener::bind(&addr)
|
|
.expect("unable to bind TCP listener");
|
|
|
|
let mut connections = Arc::new(Mutex::new(HashMap::new()));
|
|
//let mut users = Arc::new(Mutex::new(HashMap::new()));
|
|
//let mut channels = Arc::new(Mutex::new(HashMap::new()));
|
|
|
|
let server = listener.incoming()
|
|
.map_err(|e| eprintln!("accept failed = {:?}", e))
|
|
.for_each(|sock| {
|
|
let addr = sock.peer_addr().unwrap();
|
|
println!("{} connected", addr);
|
|
let (reader, writer) = sock.split();
|
|
let (tx, rx) = futures::channel::mpsc::unbounded();
|
|
|
|
connections.lock().unwrap().insert(addr, tx);
|
|
|
|
let bufreader = BufReader::new(reader);
|
|
|
|
let iter = stream::iter_ok::<_, io::Error>(iter::repeat(()));
|
|
let socket_reader = iter.fold(bufreader, move |reader, _| {
|
|
io::read_until(reader, b'\n', vec![])
|
|
.and_then(|(reader, vec)| {
|
|
if vec.len() == 0 {
|
|
Err(io::Error::new(io::ErrorKind::BrokenPipe, "broken pipe"))
|
|
}
|
|
else {
|
|
Ok((reader, vec))
|
|
}
|
|
})
|
|
.map(move |(reader, vec)| {
|
|
let line = String::from_utf8(vec).unwrap();
|
|
let msg = models::IrcMessage::from_str(&line);
|
|
match msg {
|
|
Some(msg) => {
|
|
println!("{} -> {}", addr, msg.to_string().trim());
|
|
|
|
},
|
|
None => eprintln!("Unhandled message: {} -> {}", addr, line.trim()),
|
|
};
|
|
reader
|
|
})
|
|
});
|
|
|
|
|
|
// Spawn the future as a concurrent task.
|
|
tokio::spawn(socket_reader.then(move |_| {
|
|
println!("Connection {} closed", addr);
|
|
Ok(())
|
|
}))
|
|
});
|
|
|
|
tokio::run(server);
|
|
}
|