give the discord module the ability to recieve events and transmit messages
This commit is contained in:
parent
a37b6ab627
commit
93ee23c831
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user