diff --git a/src/event/mod.rs b/src/event/mod.rs index 991e828..b8e8690 100644 --- a/src/event/mod.rs +++ b/src/event/mod.rs @@ -1,8 +1,8 @@ use {Channel, User}; #[derive(Debug, Clone)] -pub enum Event<'a> { - Message { sender: &'a User, channel: Option<&'a Channel>, content: String }, - Join { channel: &'a Channel }, - Quit { channel: &'a Channel } +pub enum Event { + Message { sender: User, channel: Option, content: String }, + Join { channel: Channel }, + Quit { channel: Channel } } diff --git a/src/lib.rs b/src/lib.rs index fc44215..ef77940 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ extern crate toml; extern crate crossbeam; +extern crate discord; use std::collections::BTreeMap; use toml::Table; diff --git a/src/plugins/discord.rs b/src/plugins/discord.rs index f1cbd14..51889f7 100644 --- a/src/plugins/discord.rs +++ b/src/plugins/discord.rs @@ -1,19 +1,54 @@ +use discord; +use discord::Discord; +use discord::model::Event; + use plugins::Plugin; use toml::Table; -pub struct DiscordPlugin { +use event; +use std::sync::mpsc::Sender; +use User; +use Channel; + +use std::collections::BTreeMap; + +pub struct DiscordPlugin { + token: String } impl DiscordPlugin { pub fn new (configuration: &Table) -> Box { - match configuration.get("channel") { - Some(channel) => println!("Using channel: {}", channel), - None => println!("No channel specified") - } + let token = configuration.get("token") + .and_then(|value| value.as_str()) + .unwrap_or(""); - Box::new(DiscordPlugin {}) + Box::new(DiscordPlugin { + token: String::from(token) + }) } } -impl Plugin for DiscordPlugin {} +impl Plugin for DiscordPlugin { + fn produce_events<'a>(&'a self, sender: Sender) { + let discord = Discord::from_bot_token(&self.token[..]).expect("Login failed"); + let (mut connection, _) = discord.connect().expect("Connection failed"); + loop { + match connection.recv_event() { + Ok(Event::MessageCreate(message)) => { + let author = User { + name: message.author.name + }; + + sender.send(event::Event::Message { sender: author, content: message.content, channel: None }); + } + Ok(_) => {} + Err(discord::Error::Closed(code, body)) => { + println!("Gateway closed on us with code {:?}: {}", code, body); + break + } + Err(err) => println!("Receive error: {:?}", err) + } + } + } +} diff --git a/src/plugins/mod.rs b/src/plugins/mod.rs index 21a4b70..c1e434b 100644 --- a/src/plugins/mod.rs +++ b/src/plugins/mod.rs @@ -14,5 +14,5 @@ use std::sync::mpsc::{Sender, Receiver}; pub trait Plugin : Sync { fn register (&self, tenquestionmarks: &Tenquestionmarks) {} fn consume_events (&self, receiver: Receiver) {} - fn produce_events<'a>(&'a self, sender: Sender>) {} + fn produce_events<'a>(&'a self, sender: Sender) {} } diff --git a/src/plugins/stdin.rs b/src/plugins/stdin.rs index 348eb76..ab45463 100644 --- a/src/plugins/stdin.rs +++ b/src/plugins/stdin.rs @@ -23,14 +23,14 @@ impl StdinPlugin { } impl Plugin for StdinPlugin { - fn produce_events<'a>(&'a self, sender: Sender>) { + fn produce_events<'a>(&'a self, sender: Sender) { let user = &self.user; loop { let mut input = String::new(); match io::stdin().read_line(&mut input) { Ok(n) => { - let message = Event::Message { sender: user, content: input, channel: None }; + let message = Event::Message { sender: user.clone(), content: input, channel: None }; sender.send(message); } Err(error) => println!("error: {}", error),