diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/freq.rs | 86 | ||||
-rw-r--r-- | src/main.rs | 64 |
2 files changed, 64 insertions, 86 deletions
diff --git a/src/freq.rs b/src/freq.rs deleted file mode 100644 index 792f620..0000000 --- a/src/freq.rs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2015 Till Höppner -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -extern crate ilc; -extern crate chrono; - -use std::io; -use std::collections::hash_map::*; - -use chrono::offset::fixed::FixedOffset; -use chrono::naive::date::NaiveDate; - -use ilc::event::{ Event, Type }; -use ilc::context::Context; -use ilc::format::{ self, Decode }; - -struct Person { - lines: u32, - words: u32 -} - -fn words(s: &str) -> u32 { - s.split_whitespace().filter(|s| !s.is_empty()).count() as u32 -} - -fn strip_nick_prefix(s: &str) -> &str { - if s.is_empty() { return s } - match s.as_bytes()[0] { - b'~' | b'&' | b'@' | b'%' | b'+' => &s[1..], - _ => s - } -} - -fn main() { - let stdin = io::stdin(); - - let mut stats: HashMap<String, Person> = HashMap::new(); - let context = Context { - timezone: FixedOffset::west(0), - override_date: Some(NaiveDate::from_ymd(2015, 6, 10)), - channel: Some("#code".to_owned()) - }; - - let mut parser = format::weechat3::Weechat3; - for e in parser.decode(&context, stdin.lock()) { - let m = match e { - Ok(m) => m, - Err(err) => panic!(err) - }; - - match m { - Event { ty: Type::Msg { ref from, ref content, .. }, .. } => { - let nick = strip_nick_prefix(from); - if stats.contains_key(nick) { - let p: &mut Person = stats.get_mut(nick).unwrap(); - p.lines += 1; - p.words += words(content); - } else { - stats.insert(nick.to_owned(), Person { - lines: 1, - words: words(content) - }); - } - }, - _ => () - } - } - - let mut stats: Vec<(String, Person)> = stats.into_iter().collect(); - stats.sort_by(|&(_, ref a), &(_, ref b)| b.words.cmp(&a.words)); - - for &(ref name, ref stat) in stats.iter().take(10) { - println!("{}:\n\tLines: {}\n\tWords: {}", name, stat.lines, stat.words) - } -} diff --git a/src/main.rs b/src/main.rs index 1f22995..8a8f289 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,6 +30,7 @@ use std::io::{ self, BufReader }; use std::fs::File; use std::error::Error; use std::str::FromStr; +use std::collections::HashMap; use docopt::Docopt; @@ -38,6 +39,7 @@ use chrono::naive::date::NaiveDate; use ilc::context::Context; use ilc::format::{ self, Encode, Decode, DecodeBox }; +use ilc::event::{ Event, Type }; static USAGE: &'static str = r#" d8b 888 @@ -54,6 +56,7 @@ A converter and statistics utility for IRC log files. Usage: ilc parse <file>... ilc convert <informat> <outformat> [--date DATE] [--tz SECS] [--channel CH] + ilc freq ilc (-h | --help | -v | --version) Options: @@ -68,6 +71,7 @@ Options: struct Args { cmd_parse: bool, cmd_convert: bool, + cmd_freq: bool, arg_file: Vec<String>, arg_informat: Option<String>, arg_outformat: Option<String>, @@ -135,4 +139,64 @@ fn main() { } } } + + if args.cmd_freq { + struct Person { + lines: u32, + words: u32 + } + + fn words(s: &str) -> u32 { + s.split_whitespace().filter(|s| !s.is_empty()).count() as u32 + } + + fn strip_nick_prefix(s: &str) -> &str { + if s.is_empty() { return s } + match s.as_bytes()[0] { + b'~' | b'&' | b'@' | b'%' | b'+' => &s[1..], + _ => s + } + } + + let stdin = io::stdin(); + + let mut stats: HashMap<String, Person> = HashMap::new(); + let context = Context { + timezone: FixedOffset::west(0), + override_date: Some(NaiveDate::from_ymd(2015, 6, 10)), + channel: Some("#code".to_owned()) + }; + + let mut parser = format::weechat3::Weechat3; + for e in parser.decode(&context, stdin.lock()) { + let m = match e { + Ok(m) => m, + Err(err) => panic!(err) + }; + + match m { + Event { ty: Type::Msg { ref from, ref content, .. }, .. } => { + let nick = strip_nick_prefix(from); + if stats.contains_key(nick) { + let p: &mut Person = stats.get_mut(nick).unwrap(); + p.lines += 1; + p.words += words(content); + } else { + stats.insert(nick.to_owned(), Person { + lines: 1, + words: words(content) + }); + } + }, + _ => () + } + } + + let mut stats: Vec<(String, Person)> = stats.into_iter().collect(); + stats.sort_by(|&(_, ref a), &(_, ref b)| b.words.cmp(&a.words)); + + for &(ref name, ref stat) in stats.iter().take(10) { + println!("{}:\n\tLines: {}\n\tWords: {}", name, stat.lines, stat.words) + } + } } |