diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 94 |
1 files changed, 69 insertions, 25 deletions
diff --git a/src/main.rs b/src/main.rs index 8c1d503..90859c2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,9 +36,65 @@ struct WikiQueryResponse { #[derive(Debug, PartialEq, Serialize, Deserialize)] struct WikiQuery { redirects: Option<Vec<WikiRedirect>>, + normalized: Option<Vec<WikiRedirect>>, pages: HashMap<String, WikiPage>, } +fn user_agent() -> hyper::header::UserAgent { + hyper::header::UserAgent("lidavidm_irc_bot/0.1 (https://git.lidavidm.me; li.davidm96@gmail.com) hyper/0.7.2".to_owned()) +} + +fn query_page(article: &str) -> serde_json::Result<WikiQueryResponse>{ + let client = Client::new(); + let mut res = client + .get(&format!("https://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&explaintext=&titles={}&redirects=", article.replace(" ", "%20"))) + .header(user_agent()) + .header(Connection::close()) + .send().unwrap(); + + let mut body = String::new(); + res.read_to_string(&mut body).unwrap(); + + serde_json::from_str(&body) +} + +fn emote_action(action: &str) -> Option<&str> { + if action == "shrugs" { + Some("¯\\_(ツ)_/¯") + } + else { + None + } +} + +fn extract_username(prefix: Option<String>) -> Option<String> { + prefix.and_then(|p| p.split("!").next().map(|s| s.to_owned())) +} + +fn wiki_query<T: IrcRead, U: IrcWrite>(server: &IrcServer<T, U>, origin: &str, article: &str) { + let response = query_page(article); + + if let Ok(q) = response { + for page in q.query.pages.values() { + let url = format!("https://en.wikipedia.org/?curid={}", page.pageid); + server.send_privmsg(origin, &format!("{}: {}", page.title, url)).unwrap(); + server.send_privmsg(origin, &page.extract).unwrap(); + break; + } + } + else { + server.send_privmsg(origin, "Sorry, I couldn't retrieve the wiki page.").unwrap(); + println!("{:?}", response); + } +} + +fn emote<T: IrcRead, U: IrcWrite>(server: &IrcServer<T, U>, username: &str, action: &str) { + if let Some(reply) = emote_action(action) { + // TODO: don't hardcode channel + server.send_privmsg("#opensourcecornell", &(username.to_owned() + " is " + reply)[..]).unwrap(); + } +} + fn main() { let config = Config { nickname: Some(format!("lidavidm_prime")), @@ -50,34 +106,22 @@ fn main() { server.identify().unwrap(); for message in server.iter() { let message = message.unwrap(); // We'll just panic if there's an error. - print!("{}", message.into_string()); + println!("{:?}", message); if &message.command[..] == "PRIVMSG" { if let Some(msg) = message.suffix { - if msg.starts_with("!wiki") { - let article = msg[5..].trim(); - - let mut client = Client::new(); - let mut res = client - .get(&format!("https://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&explaintext=&titles={}&redirects=", article.replace(" ", "%20"))) - .header(hyper::header::UserAgent("lidavidm_irc_bot/0.1 (https://git.lidavidm.me; li.davidm96@gmail.com) hyper/0.7.2".to_owned())) - .header(Connection::close()) - .send().unwrap(); - - let mut body = String::new(); - res.read_to_string(&mut body).unwrap(); - - let response: serde_json::Result<WikiQueryResponse> = serde_json::from_str(&body); - if let Ok(q) = response { - for page in q.query.pages.values() { - let url = format!("https://en.wikipedia.org/?curid={}", page.pageid); - server.send_privmsg(&message.args[0], &format!("{}: {}", page.title, url)).unwrap(); - server.send_privmsg(&message.args[0], &page.extract).unwrap(); - break; - } + if let Some(username) = extract_username(message.prefix) { + let origin = &message.args[0]; + if msg.starts_with("!wiki") { + let article = msg[5..].trim(); + wiki_query(&server, origin, article); + } + else if msg.starts_with("\u{1}ACTION") { + let action = msg[8..msg.len() - 1].trim(); + emote(&server, &username, action); } - else { - server.send_privmsg(&message.args[0], "Sorry, I couldn't retrieve the wiki page.").unwrap(); - println!("{} {:?}", body, response); + else if msg.starts_with("/me") { + let action = msg[3..].trim(); + emote(&server, &username, action); } } } |