diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | src/feature/jisoku.rs | 55 | ||||
| -rw-r--r-- | src/feature/mod.rs | 23 | ||||
| -rw-r--r-- | src/feature/tasterank.rs | 61 | ||||
| -rw-r--r-- | src/main.rs | 21 |
5 files changed, 157 insertions, 4 deletions
| @@ -1 +1,2 @@ | |||
| 1 | target | 1 | target |
| 2 | data | ||
diff --git a/src/feature/jisoku.rs b/src/feature/jisoku.rs new file mode 100644 index 0000000..70bc886 --- /dev/null +++ b/src/feature/jisoku.rs | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | extern crate telegram_bot; | ||
| 2 | use telegram_bot::{Api, Message, MessageType}; | ||
| 3 | use std::sync::{Arc, Mutex}; | ||
| 4 | use std::thread; | ||
| 5 | use std::time::Duration; | ||
| 6 | |||
| 7 | use std::ascii::AsciiExt; | ||
| 8 | |||
| 9 | use feature::FeatureResult; | ||
| 10 | use feature::Feature; | ||
| 11 | |||
| 12 | pub struct Jisoku { | ||
| 13 | running: bool, | ||
| 14 | } | ||
| 15 | |||
| 16 | const MESSAGES: [&'static str; 5] = ["JISOKU METER FURIKIRI UBAU GAME", | ||
| 17 | "I AM A CHASER DARE YORI HAYAI RACE", | ||
| 18 | "LIFE IS FIRE TSUKIRU MADE HIGH PACE", | ||
| 19 | "LETS GET READY TO RUMBLE MEZAMERO PASSION", | ||
| 20 | "*insert dubstep*"]; | ||
| 21 | |||
| 22 | impl Feature for Jisoku { | ||
| 23 | fn name(&self) -> &'static str { | ||
| 24 | "Jisoku Meter" | ||
| 25 | } | ||
| 26 | fn init(&mut self) {} | ||
| 27 | fn handle(&mut self, a: Api, m: Message) -> Result<FeatureResult, String> { | ||
| 28 | if let MessageType::Text(ref s) = m.msg { | ||
| 29 | if !(&s).contains("JISOKU METER") { | ||
| 30 | return Ok(FeatureResult::Skip); | ||
| 31 | } | ||
| 32 | } else { | ||
| 33 | return Ok(FeatureResult::Skip); | ||
| 34 | } | ||
| 35 | |||
| 36 | if self.running { | ||
| 37 | return Ok(FeatureResult::Skip); | ||
| 38 | } | ||
| 39 | self.running = true; | ||
| 40 | thread::spawn(move || { | ||
| 41 | for s in MESSAGES.into_iter() { | ||
| 42 | a.send_message(m.chat.id(), (*s).to_owned(), None, None, None, None); | ||
| 43 | thread::sleep(Duration::new(1, 0)); | ||
| 44 | } | ||
| 45 | }); | ||
| 46 | Ok(FeatureResult::Handled) | ||
| 47 | } | ||
| 48 | } | ||
| 49 | |||
| 50 | impl Jisoku { | ||
| 51 | pub fn new() -> Jisoku { | ||
| 52 | let mut j = Jisoku { running: false }; | ||
| 53 | j | ||
| 54 | } | ||
| 55 | } | ||
diff --git a/src/feature/mod.rs b/src/feature/mod.rs new file mode 100644 index 0000000..5e00620 --- /dev/null +++ b/src/feature/mod.rs | |||
| @@ -0,0 +1,23 @@ | |||
| 1 | use std::boxed::Box; | ||
| 2 | use std::error::Error; | ||
| 3 | |||
| 4 | extern crate telegram_bot; | ||
| 5 | use telegram_bot::{Api, Message}; | ||
| 6 | |||
| 7 | pub mod jisoku; | ||
| 8 | pub mod tasterank; | ||
| 9 | |||
| 10 | pub enum FeatureResult { | ||
| 11 | Handled, | ||
| 12 | Skip, | ||
| 13 | } | ||
| 14 | |||
| 15 | pub trait Feature { | ||
| 16 | fn name(&self) -> &'static str; | ||
| 17 | fn init(&mut self); | ||
| 18 | fn handle(&mut self, Api, Message) -> Result<FeatureResult, String>; | ||
| 19 | } | ||
| 20 | |||
| 21 | pub fn init() -> Vec<Box<Feature>> { | ||
| 22 | vec![Box::new(tasterank::Tasterank::new()), Box::new(jisoku::Jisoku::new())] | ||
| 23 | } | ||
diff --git a/src/feature/tasterank.rs b/src/feature/tasterank.rs new file mode 100644 index 0000000..c4a29f9 --- /dev/null +++ b/src/feature/tasterank.rs | |||
| @@ -0,0 +1,61 @@ | |||
| 1 | use std::option::Option; | ||
| 2 | use std::io; | ||
| 3 | use std::io::prelude::*; | ||
| 4 | use std::fs::File; | ||
| 5 | |||
| 6 | use std::ascii::AsciiExt; | ||
| 7 | |||
| 8 | extern crate telegram_bot; | ||
| 9 | use telegram_bot::{Api, Message, MessageType}; | ||
| 10 | |||
| 11 | use feature::FeatureResult; | ||
| 12 | use feature::Feature; | ||
| 13 | |||
| 14 | pub struct Tasterank { | ||
| 15 | ranks: Vec<String>, | ||
| 16 | } | ||
| 17 | |||
| 18 | impl Feature for Tasterank { | ||
| 19 | fn name(&self) -> &'static str { | ||
| 20 | "Tasterank" | ||
| 21 | } | ||
| 22 | fn init(&mut self) { | ||
| 23 | if let Err(e) = self.update_ranks() { | ||
| 24 | panic!(e); | ||
| 25 | } | ||
| 26 | } | ||
| 27 | fn handle(&mut self, a: Api, m: Message) -> Result<FeatureResult, String> { | ||
| 28 | if let MessageType::Text(s) = m.msg { | ||
| 29 | if !(&s).to_ascii_lowercase().contains("luggas tasterank") { | ||
| 30 | return Ok(FeatureResult::Skip); | ||
| 31 | } | ||
| 32 | let mut msg = String::new(); | ||
| 33 | for (i, rank) in self.ranks.iter().enumerate() { | ||
| 34 | msg.push_str(&format!("{}. {}\n", i + 1, rank)); | ||
| 35 | } | ||
| 36 | a.send_message(m.chat.id(), msg, None, None, Some(m.message_id), None); | ||
| 37 | return Ok(FeatureResult::Handled); | ||
| 38 | } | ||
| 39 | Ok(FeatureResult::Skip) | ||
| 40 | } | ||
| 41 | } | ||
| 42 | |||
| 43 | impl Tasterank { | ||
| 44 | pub fn new() -> Tasterank { | ||
| 45 | let mut t = Tasterank { ranks: vec![] }; | ||
| 46 | t.init(); | ||
| 47 | t | ||
| 48 | } | ||
| 49 | fn update_ranks(&mut self) -> Result<(), io::Error> { | ||
| 50 | let mut f = try!(File::open("data/tasterank.list")); | ||
| 51 | let mut buf = String::new(); | ||
| 52 | try!(f.read_to_string(&mut buf)); | ||
| 53 | let temp: Vec<&str> = (&buf).split("\n").collect(); | ||
| 54 | self.ranks.clear(); | ||
| 55 | for r in &temp { | ||
| 56 | self.ranks.push(r.to_string()); | ||
| 57 | } | ||
| 58 | self.ranks.pop().unwrap(); | ||
| 59 | Ok(()) | ||
| 60 | } | ||
| 61 | } | ||
diff --git a/src/main.rs b/src/main.rs index 4cca6d1..eaec1f4 100644 --- a/src/main.rs +++ b/src/main.rs | |||
| @@ -1,18 +1,31 @@ | |||
| 1 | extern crate telegram_bot; | 1 | extern crate telegram_bot; |
| 2 | use telegram_bot::{Api, ListeningMethod, ListeningAction, Update}; | ||
| 2 | 3 | ||
| 3 | use telegram_bot::{Api, ListeningMethod, ListeningAction, MessageType, Update}; | 4 | mod feature; |
| 5 | use feature::{Feature, FeatureResult}; | ||
| 4 | 6 | ||
| 5 | fn main() { | 7 | fn main() { |
| 6 | let api = Api::from_env("TELEGRAM_BOT_TOKEN").unwrap(); | 8 | let api = Api::from_env("TELEGRAM_BOT_TOKEN").unwrap(); |
| 7 | 9 | ||
| 8 | println!("api started: {:?}", api.get_me()); | 10 | println!("api started: {:?}", api.get_me()); |
| 11 | let mut features = feature::init(); | ||
| 9 | 12 | ||
| 10 | let mut listener = api.listener(ListeningMethod::LongPoll(None)); | 13 | let mut listener = api.listener(ListeningMethod::LongPoll(None)); |
| 11 | let res = listener.listen(|u| { | 14 | let res = listener.listen(|u| { |
| 12 | if let Some(m) = u.message { | 15 | if let Some(m) = u.message { |
| 13 | let name = m.from.first_name; | 16 | for f in &mut features { |
| 14 | 17 | match (**f).handle(api.clone(), m.clone()) { | |
| 15 | println!("got message from {}", name); | 18 | Ok(r) => { |
| 19 | match r { | ||
| 20 | FeatureResult::Handled => break, | ||
| 21 | FeatureResult::Skip => continue, | ||
| 22 | }; | ||
| 23 | } | ||
| 24 | Err(e) => { | ||
| 25 | println!("Error in feature {}: {}", f.name(), e); | ||
| 26 | } | ||
| 27 | }; | ||
| 28 | } | ||
| 16 | }; | 29 | }; |
| 17 | Ok(ListeningAction::Continue) | 30 | Ok(ListeningAction::Continue) |
| 18 | }); | 31 | }); |
