use discord; use discord::Discord; use discord::model::Event; use modules::Module; use toml::Table; use event; use std::sync::Arc; use std::sync::mpsc::Sender; use MessageSender; use User; use Channel; pub struct DiscordModule { token: String } impl DiscordModule { pub fn new (configuration: &Table) -> Box { let token = configuration.get("token") .and_then(|value| value.as_str()) .unwrap_or(""); Box::new(DiscordModule { token: String::from(token) }) } } pub struct DiscordMessageSender { discord: Arc, channel_id: discord::model::ChannelId } impl MessageSender for DiscordMessageSender { fn send_message (&self, message: &str) { self.discord.send_message(&self.channel_id, message, "", false); } } impl Module for DiscordModule { fn produce_events<'a>(&'a self, sender: Sender) { let discord = Arc::new(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.clone(), sender: Arc::new(DiscordMessageSender { discord: discord.clone(), channel_id: message.channel_id }) }; let channel = Channel { name: String::from("channel"), description: String::from(""), topic: String::from(""), sender: Arc::new(DiscordMessageSender { discord: discord.clone(), channel_id: message.channel_id }) }; sender.send(event::Event::Message { sender: author, content: message.content, channel: Option::Some(channel) }); } Ok(_) => {} Err(discord::Error::Closed(code, body)) => { println!("Gateway closed on us with code {:?}: {}", code, body); break } Err(err) => println!("Receive error: {:?}", err) } } } }