78 lines
2.2 KiB
Rust
Raw Normal View History

use discord;
use discord::Discord;
use discord::model::Event;
use plugins::Plugin;
use toml::Table;
use event;
2017-02-16 00:16:48 -06:00
use std::sync::Arc;
use std::sync::mpsc::Sender;
use MessageSender;
use User;
use Channel;
pub struct DiscordPlugin {
token: String
}
impl DiscordPlugin {
pub fn new (configuration: &Table) -> Box<Plugin> {
let token = configuration.get("token")
.and_then(|value| value.as_str())
.unwrap_or("");
Box::new(DiscordPlugin {
token: String::from(token)
})
}
}
pub struct DiscordMessageSender {
2017-02-16 00:16:48 -06:00
channel_id: discord::model::ChannelId
}
impl MessageSender for DiscordMessageSender {
fn send_message (&self, message: &str) {
2017-02-16 00:16:48 -06:00
println!("send to {:?}: {:?}", self.channel_id, message);
}
}
impl Plugin for DiscordPlugin {
fn produce_events<'a>(&'a self, sender: Sender<event::Event>) {
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.clone(),
2017-02-16 00:16:48 -06:00
sender: Arc::new(DiscordMessageSender {
channel_id: message.channel_id
})
};
let channel = Channel {
name: String::from("channel"),
description: String::from(""),
topic: String::from(""),
2017-02-16 00:16:48 -06:00
sender: Arc::new(DiscordMessageSender {
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)
}
}
}
}