ircd.rs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. use async_executor::Executor;
  2. use async_std::io::BufReader;
  3. use futures::{AsyncBufReadExt, AsyncWriteExt, Future, FutureExt};
  4. use log::{info, error, warn};
  5. use std::io;
  6. use smol::Async;
  7. use std::{
  8. net::{SocketAddr, TcpListener, TcpStream},
  9. sync::Arc,
  10. };
  11. use drk::{Error, Result};
  12. /*
  13. NICK fifififif
  14. USER username 0 * :Real
  15. :behemoth 001 fifififif :Hi, welcome to IRC
  16. :behemoth 002 fifififif :Your host is behemoth, running version miniircd-2.1
  17. :behemoth 003 fifififif :This server was created sometime
  18. :behemoth 004 fifififif behemoth miniircd-2.1 o o
  19. :behemoth 251 fifififif :There are 1 users and 0 services on 1 server
  20. :behemoth 422 fifififif :MOTD File is missing
  21. JOIN #dev
  22. :fifififif!username@127.0.0.1 JOIN #dev
  23. :behemoth 331 fifififif #dev :No topic is set
  24. :behemoth 353 fifififif = #dev :fifififif
  25. :behemoth 366 fifififif #dev :End of NAMES list
  26. PRIVMSG #dev hihi
  27. */
  28. async fn process(mut stream: Async<TcpStream>, peer_addr: SocketAddr) {
  29. //stream.write_all(b":behemoth 001 fifififif :Hi, welcome to IRC").await;
  30. //stream.write_all(b"NICK fofofofofo");
  31. //stream.write_all(b"USER username 0 * :Real");
  32. //stream.write_all(b"JOIN #dev");
  33. //stream.write_all(b"PRIVMSG #dev y0");
  34. // PING :behemoth
  35. let mut reader = BufReader::new(stream);
  36. loop {
  37. let mut line = String::new();
  38. if let Err(err) = reader.read_line(&mut line).await {
  39. warn!("Read line ended. Closing stream for {}", peer_addr);
  40. return;
  41. }
  42. if line.len() == 0 {
  43. warn!("Received empty line from {}. Closing connection.", peer_addr);
  44. return;
  45. }
  46. assert!(&line[(line.len() - 1)..] == "\n");
  47. // Remove the \n character
  48. line.pop();
  49. println!("Recv: {}", line);
  50. }
  51. }
  52. async fn async_main(executor: Arc<Executor<'_>>) -> Result<()> {
  53. let accept_addr = ([127, 0, 0, 1], 6667);
  54. let listener = match Async::<TcpListener>::bind(accept_addr) {
  55. Ok(listener) => listener,
  56. Err(err) => {
  57. error!("Bind listener failed: {}", err);
  58. return Err(Error::OperationFailed)
  59. }
  60. };
  61. let local_addr = match listener.get_ref().local_addr() {
  62. Ok(addr) => addr,
  63. Err(err) => {
  64. error!("Failed to get local address: {}", err);
  65. return Err(Error::OperationFailed)
  66. }
  67. };
  68. info!("Listening on {}", local_addr);
  69. loop {
  70. let (stream, peer_addr) = match listener.accept().await {
  71. Ok((s, a)) => (s, a),
  72. Err(err) => {
  73. error!("Error listening for connections: {}", err);
  74. return Err(Error::ServiceStopped)
  75. }
  76. };
  77. info!("Accepted client: {}", peer_addr);
  78. executor.spawn(process(stream, peer_addr)).detach();
  79. }
  80. }
  81. fn main() -> Result<()> {
  82. simple_logger::init_with_level(log::Level::Trace)?;
  83. let ex = Arc::new(Executor::new());
  84. smol::block_on(ex.run(async_main(ex.clone())))
  85. //let acceptor = Acceptor::new();
  86. //let listener = match Async::<TcpListener>::bind(accept_addr) {
  87. // Ok(listener) => listener,
  88. // Err(err) => {
  89. // error!("Bind listener failed: {}", err);
  90. // return Err(Error::OperationFailed)
  91. // }
  92. //};
  93. //let local_addr = match listener.get_ref().local_addr() {
  94. // Ok(addr) => addr,
  95. // Err(err) => {
  96. // error!("Failed to get local address: {}", err);
  97. // return Err(Error::OperationFailed)
  98. // }
  99. //};
  100. }