1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
use std::io::BufRead;
use std::borrow::ToOwned;
use log::Event;
use format::Decode;
use regex::Regex;
use chrono::*;
pub struct Weechat3;
static NORMAL_LINE: Regex = regex!(r"^(\d+-\d+-\d+ \d+:\d+:\d+)\t[@%+~&]?([^ <-]\S+)\t(.*)");
static ACTION_LINE: Regex = regex!(r"^(\d+-\d+-\d+ \d+:\d+:\d+)\t \*\t(\S+) (.*)");
//static OTHER_LINES: Regex = regex!(r"^(\d+-\d+-\d+ \d+:\d+:\d+)\s(?:--|<--|-->)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\n$");
static OTHER_LINES: Regex = regex!(r"(.*)");
static TIME_DATE_FORMAT: &'static str = "%Y-%m-%d %H:%M:%S";
pub struct Iter<R> where R: BufRead {
input: R,
buffer: String
}
impl<R> Iterator for Iter<R> where R: BufRead {
type Item = ::Result<Event>;
fn next(&mut self) -> Option<::Result<Event>> {
fn time(s: &str) -> i64 {
UTC.datetime_from_str(s, TIME_DATE_FORMAT).unwrap().timestamp()
}
println!("Reading line...");
self.buffer.clear();
match self.input.read_line(&mut self.buffer) {
Ok(0) | Err(_) => return None,
Ok(_) => ()
}
let line = &self.buffer;
println!("Read line: {}", line);
if let Some(cap) = NORMAL_LINE.captures(line) {
return Some(Ok(Event::Msg {
from: cap.at(1).unwrap().to_owned(),
content: cap.at(2).unwrap().to_owned(),
time: time(cap.at(0).unwrap())
}))
} else if let Some(cap) = ACTION_LINE.captures(line) {
return Some(Ok(Event::Action {
from: cap.at(1).unwrap().to_owned(),
content: cap.at(2).unwrap().to_owned(),
time: time(cap.at(0).unwrap())
}))
} else if let Some(cap) = OTHER_LINES.captures(line) {
if cap.at(4) == Some("has") && cap.at(5) == Some("kicked") {
return Some(Ok(Event::Kick {
kicked_nick: cap.at(6).unwrap().to_owned(),
kicking_nick: cap.at(3).unwrap().to_owned(),
kick_message: cap.at(4).unwrap().to_owned(),
time: time(cap.at(0).unwrap())
}))
} else if cap.at(3) == Some("has") && cap.at(5) == Some("changed") && cap.at(6) == Some("topic") {
return Some(Ok(Event::Topic {
new_topic: cap.at(5).unwrap().to_owned(),
time: time(cap.at(0).unwrap())
}))
} else if cap.at(3) == Some("Mode") {
return Some(Ok(Event::Mode {
time: time(cap.at(0).unwrap())
}))
} else if cap.at(5) == Some("has") && cap.at(6) == Some("joined") {
return Some(Ok(Event::Join {
nick: cap.at(3).unwrap().to_owned(),
mask: String::new(),
time: time(cap.at(0).unwrap())
}))
} else if cap.at(5) == Some("now") && cap.at(6) == Some("known") {
}
}
Some(Err(::IlcError::Parse(format!("Line `{}` didn't match any rules.", line))))
}
}
impl<R> Decode<R, Iter<R>> for Weechat3 where R: BufRead {
fn decode(&mut self, input: R) -> Iter<R> {/*
for line in input.lines() {
let line = &*try!(line);
} else {
handler.err(&format!("Malformatted line: {}", line));
}
}*/
Iter {
input: input,
buffer: String::new()
}
}
}
|