From fe1e048e42865a57b7bfd6e78cf44aefb1269a11 Mon Sep 17 00:00:00 2001 From: Till Hoeppner Date: Mon, 3 Nov 2014 16:50:28 +0100 Subject: Proper PRIVMSG parsing --- src/event.rs | 19 +++++++++++++++++-- src/server.rs | 17 +++-------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/event.rs b/src/event.rs index 7e280a9..aef34f9 100644 --- a/src/event.rs +++ b/src/event.rs @@ -4,15 +4,28 @@ use ident::Ident; pub struct Event { pub prefix: String, pub command: String, - pub content: String + pub content: Vec } pub trait ParseResult { fn parse(event: Event) -> Option; } +pub const PING: &'static str = "PING"; + pub const PRIVMSG: &'static str = "PRIVMSG"; +fn join(v: Vec, from: uint) -> String { + let mut msg = if v[from].chars().next().unwrap() == ':' { + v[from][][1..].into_string() + } else { v[from].clone() }; + for m in v.iter().skip(from + 1) { + msg.push_str(" "); + msg.push_str(m.trim_right()); + } + msg +} + pub struct PrivMsg { pub from: Ident, pub to: String, @@ -22,10 +35,12 @@ pub struct PrivMsg { impl ParseResult for PrivMsg { fn parse(event: Event) -> Option { let from = Ident::parse(event.prefix[]); + let to = event.content[0].clone(); match from { Some(from) => Some(PrivMsg { from: from, - content: event.content + to: to, + content: join(event.content, 1) }), None => None } diff --git a/src/server.rs b/src/server.rs index 277c77e..99b8fb0 100644 --- a/src/server.rs +++ b/src/server.rs @@ -8,6 +8,7 @@ use std::sync::Arc; use std::sync::Mutex; use callback::Callback; +use event; use event::Event; #[deriving(Show, PartialEq, Eq, Clone)] @@ -38,7 +39,7 @@ impl Server { fn handle_event(arg: (Server, Event)) { let (mut server, event) = arg; match event.command[] { - "PING" => { + event::PING => { server.sendraw(format!("PONG {}", event.content).as_slice(), true).unwrap(); } _ => () @@ -121,23 +122,11 @@ impl Server { parts.remove(0).unwrap() } else { "" }; - - fn join(v: Vec<&str>, from: uint) -> String { - let mut msg = if v[from].chars().next().unwrap() == ':' { - v[from][1..].into_string() - } else { v[from].into_string() }; - for m in v.iter().skip(from + 1) { - msg.push_str(" "); - msg.push_str(m.trim_right()); - } - msg - } - let cmd = parts.remove(0).unwrap(); let event = Event { prefix: prefix.into_string(), command: cmd.into_string(), - content: join(parts, 0) + content: parts.iter().map(|p| p.into_string()).collect() }; self.events.lock().fire(&(self.clone(), event)); -- cgit v1.2.3