aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Dremann <dremann@gmail.com>2014-06-10 01:16:45 -0400
committerZachary Dremann <dremann@gmail.com>2014-06-10 01:16:45 -0400
commita4dcf4b1d4586055e949062a5f5be141007ef58c (patch)
tree280159819d1cca3597ca76291276623fa3dd8349
parent43494f6d5b17b17fec728341ce9ff25d3ba77d04 (diff)
downloadrusty-irc-a4dcf4b1d4586055e949062a5f5be141007ef58c.tar.gz
rusty-irc-a4dcf4b1d4586055e949062a5f5be141007ef58c.zip
Updated
-rw-r--r--examples/client.rs16
-rw-r--r--src/lib.rs4
-rw-r--r--src/msg.rs16
3 files changed, 32 insertions, 4 deletions
diff --git a/examples/client.rs b/examples/client.rs
index ba8c1de..c2dc89f 100644
--- a/examples/client.rs
+++ b/examples/client.rs
@@ -18,10 +18,26 @@ fn main() {
drop(args);
let mut connection = IrcClient::connect(host.as_slice(), port, "rusty-irc".to_string(), "dremann".to_string(), "Zachary Dremann".to_string()).unwrap();
+ let sender = connection.sender();
let on_msg = |message: &Message| {
println!("{}", *message);
};
+
+ spawn(proc() {
+ let mut stdin = stdio::stdin();
+ for line in stdin.lines() {
+ match line {
+ Ok(s) => {
+ match from_str(s.as_slice()) {
+ Some(msg) => sender.send(msg),
+ None => ()
+ }
+ }
+ Err(_) => break,
+ }
+ }
+ });
connection.run_loop(on_msg);
}
diff --git a/src/lib.rs b/src/lib.rs
index c367185..3898480 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -46,6 +46,10 @@ impl IrcClient {
self.output_sender.send(message);
}
+ pub fn sender(&self) -> Sender<Message> {
+ self.output_sender.clone()
+ }
+
fn on_msg_rec(msg: &Message, sender: &Sender<Message>) {
let _prefix = &msg.prefix;
let cmd = &msg.command;
diff --git a/src/msg.rs b/src/msg.rs
index 8db6077..0d2daaa 100644
--- a/src/msg.rs
+++ b/src/msg.rs
@@ -17,7 +17,7 @@ pub mod cmd {
Pong(String),
Error(String),
Away(Option<String>),
- Numeric(u16, Option<String>),
+ Numeric(u16, String, Option<String>),
UnknownCmd(String, Vec<String>)
}
}
@@ -66,7 +66,7 @@ impl<'a> fmt::Show for Message {
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::Numeric(i, ref target, ref msg) => if msg.is_some() { write!(formatter, "{:03u} {} :{}", i, target, msg.get_ref()) } else { write!(formatter, "{:03u} {}", i, target) },
cmd::UnknownCmd(ref cmd, ref args) => {
try!(write!(formatter, "{}", cmd));
let mut iter = args.iter().peekable();
@@ -135,7 +135,12 @@ impl FromStr for Message {
}
}
- args.push(current_str.take_unwrap());
+ if cmd.is_none() {
+ cmd = current_str.take();
+ }
+ else {
+ args.push(current_str.take_unwrap());
+ }
let cmd = match cmd.map(|s| s.into_ascii_upper()).as_ref().map(|s| s.as_slice()) {
Some(s) => {
@@ -162,7 +167,10 @@ impl FromStr for Message {
"AWAY" if args.len() == 0 || args.len() == 1 => cmd::Away(args.pop()),
other => {
match from_str::<u16>(other) {
- Some(n) if args.len() == 0 || args.len() == 1 => cmd::Numeric(n, args.pop()),
+ Some(n) if args.len() == 1 || args.len() == 2 => {
+ let mut iter = args.move_iter();
+ cmd::Numeric(n, iter.next().unwrap(), iter.next())
+ }
_ => cmd::UnknownCmd(s.to_string(), args)
}
}