diff options
Diffstat (limited to 'libirc')
-rw-r--r-- | libirc/lib.rs | 86 | ||||
-rw-r--r-- | libirc/libirc-ad3d5237-0.1.rlib | bin | 757684 -> 0 bytes | |||
-rw-r--r-- | libirc/msg.rs | 185 |
3 files changed, 0 insertions, 271 deletions
diff --git a/libirc/lib.rs b/libirc/lib.rs deleted file mode 100644 index 8b385ec..0000000 --- a/libirc/lib.rs +++ /dev/null @@ -1,86 +0,0 @@ -#![crate_id = "irc#0.1"] -#![crate_type = "lib"] - -use std::io::net::tcp::TcpStream; -use std::io::IoResult; -use std::io::BufferedReader; -use std::io::IoError; - -use msg::Message; -use msg::cmd; - -pub mod msg; - -pub struct IrcConnection<'a> { - stream: TcpStream, - output_sender: Sender<Message>, - msg_callback: |&Message, &Sender<Message>|: 'a -> () -} - -impl<'a> IrcConnection<'a> { - pub fn connect<'b>( - host: &str, port: u16, nick: String, username: String, - real_name: String, msg_callback: |&Message, &Sender<Message>|: 'b -> ()) -> IoResult<IrcConnection<'b>> { - - let (send_writer, rec_writer) = channel(); - - let mut connection = IrcConnection { - stream: try!(TcpStream::connect(host, port)), - output_sender: send_writer.clone(), - msg_callback: msg_callback, - }; - - let writer = connection.stream.clone(); - - // spawn writer thread - spawn(proc() { - let mut writer = writer; - for msg in rec_writer.iter() { - (write!(writer, "{}", msg)).ok().expect("Unable to write to stream"); - } - }); - - connection.send(Message::new(cmd::Nick(nick))); - connection.send(Message::new(cmd::User(username, 0, real_name))); - Ok(connection) - } - - pub fn send(&mut self, message: Message) { - self.output_sender.send(message); - } - - fn on_msg_rec(msg: &Message, sender: &Sender<Message>) { - let prefix = &msg.prefix; - let cmd = &msg.command; - match *cmd { - cmd::Ping(ref s) => sender.send(Message::new(cmd::Pong(s.clone()))), - _ => { } - }; - } - - pub fn run_loop(&mut self) { - let reader = &mut self.stream; - loop { - fn reader_by_ref<'a, R: Reader>(reader: &'a mut R) -> std::io::RefReader<'a, R> { reader.by_ref() } - - reader.set_read_timeout(Some(500)); - let mut buf_reader = BufferedReader::new(reader_by_ref(reader)); - - let line = buf_reader.read_line(); - match line { - Ok(line) => match from_str::<Message>(line.as_slice().trim_right()) { - Some(msg) => { - IrcConnection::on_msg_rec(&msg, &self.output_sender); - (self.msg_callback)(&msg, &self.output_sender); - }, - None => println!("Invalid Message recieved"), - }, - Err(IoError{kind: std::io::TimedOut, ..}) => continue, - Err(e) => { - println!("Unable to read line: {}", e); - break; - } - } - } - } -} diff --git a/libirc/libirc-ad3d5237-0.1.rlib b/libirc/libirc-ad3d5237-0.1.rlib Binary files differdeleted file mode 100644 index c367445..0000000 --- a/libirc/libirc-ad3d5237-0.1.rlib +++ /dev/null diff --git a/libirc/msg.rs b/libirc/msg.rs deleted file mode 100644 index 3471d75..0000000 --- a/libirc/msg.rs +++ /dev/null @@ -1,185 +0,0 @@ -use std::fmt; -use std::from_str::FromStr; -use std::ascii::OwnedStrAsciiExt; - -pub mod cmd { - #[deriving(Clone, Show)] - pub enum Command { - Nick(String), - User(String, u8, String), - Quit(Option<String>), - Join(String), - Part(String, Option<String>), - PrivMsg(String, String), - Notice(String, String), - //Motd(Option<String>), - Ping(String), - Pong(String), - Error(String), - Away(Option<String>), - Numeric(u16, Option<String>), - UnknownCmd(String, Vec<String>) - } -} - -pub struct PrefixHost { - hostname: String, - user: Option<String>, -} - -pub enum Prefix { - PrefixServer(String), - PrefixUser(String, Option<PrefixHost>), -} - -#[deriving(Clone)] -pub struct Message { - pub prefix: Option<String>, - pub command: cmd::Command, -} - -impl Message { - pub fn new(command: cmd::Command) -> Message { - Message { prefix: None, command: command } - } - - pub fn with_prefix(prefix: String, command: cmd::Command) -> Message { - Message { prefix: Some(prefix), command: command } - } -} - -impl<'a> fmt::Show for Message { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - if self.prefix.is_some() { - try!(write!(formatter, ":{} ", self.prefix.get_ref())); - } - - match self.command { - cmd::Nick(ref nickname) => write!(formatter, "NICK {}", nickname), - cmd::User(ref username, mode, ref real_name) => write!(formatter, "USER {} {} * :{}", username, mode, real_name), - cmd::Quit(ref msg) => if msg.is_some() { write!(formatter, "QUIT :{}", *msg.get_ref()) } else { write!(formatter, "QUIT") }, - cmd::Join(ref channel) => write!(formatter, "JOIN :{}", channel), - cmd::Part(ref channel, ref msg) => if msg.is_some() { write!(formatter, "PART {} :{}", channel, *msg.get_ref()) } else { write!(formatter, "PART {}", channel) }, - cmd::PrivMsg(ref target, ref msg) => write!(formatter, "PRIVMSG {} :{}", target, msg), - cmd::Notice(ref target, ref msg) => write!(formatter, "NOTICE {} :{}", target, msg), - cmd::Ping(ref msg) => write!(formatter, "PING :{}", msg), - cmd::Pong(ref msg) => write!(formatter, "PONG :{}", msg), - cmd::Error(ref msg) => write!(formatter, "ERROR :{}", msg), - cmd::Away(ref msg) => if msg.is_some() { write!(formatter, "AWAY :{}", msg.get_ref()) } else { write!(formatter, "AWAY") }, - cmd::Numeric(i, ref msg) => if msg.is_some() { write!(formatter, "{:03u} :{}", i, msg.get_ref()) } else { write!(formatter, "{:03u}", i) }, - cmd::UnknownCmd(ref cmd, ref args) => { - try!(write!(formatter, "{}", cmd)); - let mut iter = args.iter().peekable(); - loop { - match iter.next() { - Some(arg) => { - try!( - if iter.peek().is_some() { - write!(formatter, " {}", arg) - } - else { - write!(formatter, " :{}", arg) - } - ) - } - None => break - } - } - Ok(()) - } - } - } -} - -impl FromStr for Message { - fn from_str(s: &str) -> Option<Message> { - let mut prefix = None; - let mut cmd = None; - let mut args = Vec::new(); - let mut current_str: Option<String> = None; - let mut is_prefix = false; - let mut is_final = false; - - for c in s.chars() { - match c { - c if is_final => { - current_str.get_mut_ref().push_char(c); - } - ' ' => { - if is_prefix { - prefix = current_str.take(); - } - else if cmd.is_none() { - cmd = current_str.take(); - } - else { - args.push(current_str.take_unwrap()); - } - is_prefix = false; - } - ':' if current_str.is_none() => { - current_str = Some(String::new()); - if cmd.is_none() { - is_prefix = true; - } - else { - is_final = true; - } - } - c => { - if current_str.is_none() { - current_str = Some(String::new()); - } - current_str.get_mut_ref().push_char(c) - } - } - } - - args.push(current_str.take_unwrap()); - - let cmd = match cmd.map(|s| s.into_ascii_upper()).as_ref().map(|s| s.as_slice()) { - Some("NICK") => { - if args.len() == 1 { Some(cmd::Nick(args.pop().unwrap())) } - else { None } - } - Some("USER") => { - if args.len() == 4 { - let mut iter = args.move_iter(); - let uname = iter.next().unwrap(); - let opt_mode: Option<u8> = from_str(iter.next().unwrap().as_slice()); - iter.next(); - let fullname = iter.next().unwrap(); - if opt_mode.is_some() { - Some(cmd::User(uname, opt_mode.unwrap(), fullname)) - } - else { - None - } - } - else { None } - } - Some("NOTICE") => { - if args.len() == 2 { - let mut iter = args.move_iter(); - Some(cmd::Notice(iter.next().unwrap(), iter.next().unwrap())) - } - else { None } - } - Some("PRIVMSG") => { - if args.len() == 2 { - let mut iter = args.move_iter(); - Some(cmd::PrivMsg(iter.next().unwrap(), iter.next().unwrap())) - } - else { None } - } - Some(other) => { - Some(cmd::UnknownCmd(other.to_string(), args)) - } - None => { - None - } - }; - - cmd.map(|c| Message { prefix: prefix.take(), command: c }) - } -} |