2017-02-13 22:13:33 -06:00
|
|
|
use discord;
|
|
|
|
use discord::Discord;
|
|
|
|
use discord::model::Event;
|
|
|
|
|
2017-02-16 01:05:33 -06:00
|
|
|
use modules::Module;
|
2017-02-08 03:25:03 -06:00
|
|
|
use toml::Table;
|
|
|
|
|
2017-02-13 22:13:33 -06:00
|
|
|
use event;
|
2017-02-16 00:16:48 -06:00
|
|
|
|
|
|
|
use std::sync::Arc;
|
2017-02-13 22:13:33 -06:00
|
|
|
use std::sync::mpsc::Sender;
|
|
|
|
|
2017-02-19 05:37:56 -06:00
|
|
|
use {MessageSender, Message, User, Channel};
|
2017-02-08 03:25:03 -06:00
|
|
|
|
2017-02-16 01:05:33 -06:00
|
|
|
pub struct DiscordModule {
|
2017-02-17 02:44:00 -06:00
|
|
|
token: String,
|
|
|
|
playing: String
|
2017-02-08 03:25:03 -06:00
|
|
|
}
|
|
|
|
|
2017-02-17 02:44:00 -06:00
|
|
|
const DEFAULT_PLAYING: &'static str = "tenquestionmarks 0.0.1";
|
|
|
|
|
2017-02-16 01:05:33 -06:00
|
|
|
impl DiscordModule {
|
|
|
|
pub fn new (configuration: &Table) -> Box<Module> {
|
2017-02-13 22:13:33 -06:00
|
|
|
let token = configuration.get("token")
|
|
|
|
.and_then(|value| value.as_str())
|
|
|
|
.unwrap_or("");
|
2017-02-08 03:25:03 -06:00
|
|
|
|
2017-02-17 02:44:00 -06:00
|
|
|
let playing = configuration.get("playing")
|
|
|
|
.and_then(|value| value.as_str())
|
|
|
|
.unwrap_or(DEFAULT_PLAYING);
|
|
|
|
|
2017-02-16 01:05:33 -06:00
|
|
|
Box::new(DiscordModule {
|
2017-02-17 02:44:00 -06:00
|
|
|
token: String::from(token),
|
|
|
|
playing: String::from(playing)
|
2017-02-13 22:13:33 -06:00
|
|
|
})
|
2017-02-08 03:25:03 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-15 23:41:29 -06:00
|
|
|
pub struct DiscordMessageSender {
|
2017-02-16 00:27:53 -06:00
|
|
|
discord: Arc<Discord>,
|
2017-02-16 00:16:48 -06:00
|
|
|
channel_id: discord::model::ChannelId
|
2017-02-15 23:41:29 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
impl MessageSender for DiscordMessageSender {
|
|
|
|
fn send_message (&self, message: &str) {
|
2017-02-17 02:38:15 -06:00
|
|
|
debug!("Send message to channel id {:?}: {:?}", self.channel_id, message);
|
|
|
|
match self.discord.send_message(&self.channel_id, message, "", false) {
|
|
|
|
Ok(message) => { debug!("Send message succeeded: {:?}", message.id); },
|
|
|
|
Err(err) => { error!("Send message failed: {:?}", err) }
|
|
|
|
}
|
2017-02-15 23:41:29 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-16 01:05:33 -06:00
|
|
|
impl Module for DiscordModule {
|
2017-02-19 02:55:30 -06:00
|
|
|
fn produce_events<'a>(&'a self, sender: Sender<Arc<event::Event>>) {
|
2017-02-17 02:38:15 -06:00
|
|
|
let discord = Arc::new(Discord::from_bot_token(&self.token[..]).expect("Discord module: Login failed"));
|
|
|
|
let (mut connection, _) = discord.connect().expect("Discord module: Connection failed");
|
2017-02-17 02:44:00 -06:00
|
|
|
|
|
|
|
info!("Playing {}", self.playing);
|
|
|
|
connection.set_game_name(self.playing.clone());
|
|
|
|
|
2017-02-13 22:13:33 -06:00
|
|
|
loop {
|
|
|
|
match connection.recv_event() {
|
|
|
|
Ok(Event::MessageCreate(message)) => {
|
2017-02-15 23:45:14 -06:00
|
|
|
let author = User {
|
|
|
|
name: message.author.name.clone(),
|
2017-02-19 02:55:30 -06:00
|
|
|
sender: Box::new(DiscordMessageSender {
|
2017-02-16 00:27:53 -06:00
|
|
|
discord: discord.clone(),
|
2017-02-16 00:16:48 -06:00
|
|
|
channel_id: message.channel_id
|
2017-02-15 22:41:52 -06:00
|
|
|
})
|
2017-02-13 22:13:33 -06:00
|
|
|
};
|
|
|
|
|
2017-02-15 22:41:52 -06:00
|
|
|
let channel = Channel {
|
|
|
|
name: String::from("channel"),
|
|
|
|
description: String::from(""),
|
|
|
|
topic: String::from(""),
|
2017-02-19 02:55:30 -06:00
|
|
|
sender: Box::new(DiscordMessageSender {
|
2017-02-16 00:27:53 -06:00
|
|
|
discord: discord.clone(),
|
2017-02-16 00:16:48 -06:00
|
|
|
channel_id: message.channel_id
|
2017-02-15 22:41:52 -06:00
|
|
|
})
|
|
|
|
};
|
|
|
|
|
2017-02-19 05:37:56 -06:00
|
|
|
let message = Message {
|
|
|
|
author: author,
|
|
|
|
content: message.content,
|
|
|
|
channel: Some(channel)
|
|
|
|
};
|
|
|
|
|
|
|
|
match sender.send(Arc::new(event::Event::Message { message: message })) {
|
2017-02-17 02:38:15 -06:00
|
|
|
Err(err) => error!("Error sending message event: {:?}", err),
|
|
|
|
Ok(_) => {}
|
|
|
|
}
|
2017-02-13 22:13:33 -06:00
|
|
|
}
|
|
|
|
Ok(_) => {}
|
|
|
|
Err(discord::Error::Closed(code, body)) => {
|
2017-02-17 02:38:15 -06:00
|
|
|
error!("Gateway closed on us with code {:?}: {}", code, body);
|
2017-02-13 22:13:33 -06:00
|
|
|
break
|
|
|
|
}
|
2017-02-17 02:38:15 -06:00
|
|
|
Err(err) => error!("Received error: {:?}", err)
|
2017-02-13 22:13:33 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|