give the discord module the ability to recieve events and transmit messages

This commit is contained in:
Adrian Malacoda 2018-02-22 23:43:46 -06:00
parent a37b6ab627
commit 93ee23c831

View File

@ -14,6 +14,8 @@ use transformable_channels::mpsc::ExtSender;
use std::fmt; use std::fmt;
use std::fmt::{Debug, Formatter}; use std::fmt::{Debug, Formatter};
use crossbeam;
use {MessageSender, Message, User, Channel}; use {MessageSender, Message, User, Channel};
pub struct DiscordModule { pub struct DiscordModule {
@ -96,62 +98,81 @@ fn channel_from_public_channel (discord: Arc<Discord>, channel: discord::model::
} }
impl EventLoop for DiscordModule { impl EventLoop for DiscordModule {
fn run (&self, sender: Box<ExtSender<event::Event>>, _: Receiver<Arc<event::Envelope>>) { fn run (&self, sender: Box<ExtSender<event::Event>>, receiver: Receiver<Arc<event::Envelope>>) {
let discord = Arc::new(Discord::from_bot_token(&self.token[..]).expect("Discord module: Login failed")); 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"); let (mut connection, _) = discord.connect().expect("Discord module: Connection failed");
info!("Playing {}", self.playing); info!("Playing {}", self.playing);
connection.set_game_name(self.playing.clone()); connection.set_game_name(self.playing.clone());
loop { crossbeam::scope(|scope| {
let event = connection.recv_event(); let discord_sender = discord.clone();
debug!("Received event: {:?}", event); scope.spawn(move || {
loop {
match event { if let Ok(envelope) = receiver.recv() {
Ok(Event::ServerCreate(server)) => { if let event::Event::Message { ref message } = envelope.event {
match server { if let Some(ref channel) = message.channel {
PossibleServer::Online(server) => { if let Ok(channel_id) = channel.name.parse::<u64>() {
info!("Joined server: {}", server.name); discord_sender.send_message(discord::model::ChannelId(channel_id), &message.content, "", false);
for channel in server.channels {
info!(" - Joined channel: {}", channel.name);
match sender.send(event::Event::SelfJoin {
channel: channel_from_public_channel(discord.clone(), channel)
}) {
Err(err) => error!("Error sending selfjoin event: {:?}", err),
Ok(_) => {}
} }
} }
}, }
_ => {} } else {
} break;
},
Ok(Event::MessageCreate(message)) => {
let author = User {
name: message.author.name.clone(),
sender: Box::new(DiscordMessageSender {
discord: discord.clone(),
channel_id: message.channel_id
})
};
let message = Message {
author: author,
content: message.content,
channel: discord.get_channel(message.channel_id).ok().and_then(|channel| make_channel_object(discord.clone(), channel))
};
if let Err(err) = sender.send(event::Event::Message { message: message }) {
error!("Error sending message event: {:?}", err)
} }
} }
Ok(_) => {} });
Err(discord::Error::Closed(code, body)) => {
error!("Gateway closed on us with code {:?}: {}", code, body); loop {
break let event = connection.recv_event();
} debug!("Received event: {:?}", event);
Err(err) => error!("Received error: {:?}", err)
match event {
Ok(Event::ServerCreate(server)) => {
match server {
PossibleServer::Online(server) => {
info!("Joined server: {}", server.name);
for channel in server.channels {
info!(" - Joined channel: {}", channel.name);
match sender.send(event::Event::SelfJoin {
channel: channel_from_public_channel(discord.clone(), channel)
}) {
Err(err) => error!("Error sending selfjoin event: {:?}", err),
Ok(_) => {}
}
}
},
_ => {}
}
},
Ok(Event::MessageCreate(message)) => {
let author = User {
name: message.author.name.clone(),
sender: Box::new(DiscordMessageSender {
discord: discord.clone(),
channel_id: message.channel_id
})
};
let message = Message {
author: author,
content: message.content,
channel: discord.get_channel(message.channel_id).ok().and_then(|channel| make_channel_object(discord.clone(), channel))
};
if let Err(err) = sender.send(event::Event::Message { message: message }) {
error!("Error sending message event: {:?}", err)
}
}
Ok(_) => {}
Err(discord::Error::Closed(code, body)) => {
error!("Gateway closed on us with code {:?}: {}", code, body);
break
}
Err(err) => error!("Received error: {:?}", err)
}
} }
} });
} }
} }