From 33e83d63d9df7ec1baab43a1c87ce9be196d9cac Mon Sep 17 00:00:00 2001 From: Adrian Malacoda Date: Sun, 12 Mar 2017 18:48:34 -0500 Subject: [PATCH] expand on mtg/ygo autolink --- src/modules/autolink.rs | 83 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/src/modules/autolink.rs b/src/modules/autolink.rs index d5dc884..8575259 100644 --- a/src/modules/autolink.rs +++ b/src/modules/autolink.rs @@ -5,11 +5,14 @@ use std::sync::Arc; use std::sync::mpsc::Receiver; use transformable_channels::mpsc::ExtSender; +use Message; use event::{Event, Envelope}; +use stc::Link; use stc::searchers::{Searcher, AggregateSearcher}; use stc::searchers::yugioh::{YugiohCard, YugiohSearcher}; use stc::searchers::mtg::{MtgCard, MtgSearcher}; +use stc::searchers::mediawiki::{WikiPage, MediawikiSearcher}; use regex::Regex; @@ -21,12 +24,85 @@ impl AutolinkModule { } } +fn print_mtg_card (card: &MtgCard, message: &Message) { + message.reply(&format!("{}", card.image_url)); + message.reply(&format!("**{}** (**{}**)", card.name, card.cost)); + message.reply(&format!("**{}**", card.typeline)); + message.reply(&format!("{}", card.rules)); + + match card.flavor { + Some(ref flavor) => message.reply(&format!("*{}*", flavor)), + None => {} + } + + // 12 March 2017: Is there a better way to do this? + match card.power { + Some(ref power) => { + match card.toughness { + Some(ref toughness) => { + message.reply(&format!("{}/{}", power, toughness)); + }, + None => {} + } + } + None => {} + } +} + +fn print_ygo_card (card: &YugiohCard, message: &Message) { + match card.family { + Some(ref family) => { + message.reply(&format!("**{}** ({})", card.name, family)); + }, + None => { + message.reply(&format!("**{}**", card.name)); + } + } + + match card.level { + Some(ref level) => { + message.reply(&format!("**Level**: {}", level)); + } + None => {} + } + + match card.subtype { + Some(ref subtype) => { + message.reply(&format!("**{} - {}**", card.card_type, subtype)); + } + None => { + message.reply(&format!("**{}**", card.card_type)); + } + } + + message.reply(&format!("**{}**", card.text)); + + match card.atk { + Some(ref atk) => { + match card.def { + Some(ref def) => { + message.reply(&format!("{}/{}", atk, def)); + }, + None => {} + } + } + None => {} + } +} + +fn print_any_link (link: &Link, message: &Message) { + message.reply(&format!("**Autolink:** {} -> {}", link.label(), link.url())); +} + impl Module for AutolinkModule { fn run (&self, _: Box>, receiver: Receiver>) { let link_regex = Regex::new(r"\[\[([^\[\]]*)\]\]").expect("Invalid regex..."); let mut searchers = AggregateSearcher::new(); searchers.add_searcher("mtg", Box::new(MtgSearcher::new())); searchers.add_searcher("ygo", Box::new(YugiohSearcher::new())); + searchers.add_searcher("gp", Box::new(MediawikiSearcher::new(String::from("https://gammapedia.monarch-pass.net/wiki/")))); + searchers.add_searcher("ip", Box::new(MediawikiSearcher::new(String::from("http://infinitypedia.org/wiki/")))); + searchers.add_searcher("wp", Box::new(MediawikiSearcher::new(String::from("https://en.wikipedia.org/wiki/")))); loop { match receiver.recv() { @@ -36,7 +112,12 @@ impl Module for AutolinkModule { debug!("Received message from module {:?}... {:?}", envelope.from, message.content); for cap in link_regex.captures_iter(&message.content) { if let Some(item) = searchers.exact_search(&cap[1]) { - message.reply(&format!("**Autolink:** {} -> {}", item.label(), item.url())); + print_any_link(&item, message); + if let Some(card) = item.downcast_ref::() { + print_mtg_card(card, message); + } else if let Some(card) = item.downcast_ref::() { + print_ygo_card(card, message); + } } } }