update irc module

This commit is contained in:
Adrian Malacoda 2018-05-06 04:03:37 -05:00
parent 4e6d648d18
commit 9271c39ce2

View File

@ -1,5 +1,4 @@
use irc::client::prelude::*; use irc::client::prelude::*;
use irc::client::data::command::Command;
use modules::EventLoop; use modules::EventLoop;
use toml::value::Table; use toml::value::Table;
@ -50,7 +49,7 @@ impl IrcHandler {
} }
pub struct IrcMessageSender { pub struct IrcMessageSender {
irc: IrcServerWrapper, irc: IrcClientWrapper,
channel: String channel: String
} }
@ -70,49 +69,51 @@ impl Debug for IrcMessageSender {
} }
} }
fn make_user (prefix: &Option<String>, server: &IrcServer) -> Option<User> { fn make_user (prefix: &Option<String>, server: &IrcClient) -> Option<User> {
prefix.as_ref().and_then(|prefix| prefix.split("!").next()).map(|name| User { prefix.as_ref().and_then(|prefix| prefix.split("!").next()).map(|name| User {
name: name.to_owned(), name: name.to_owned(),
sender: Box::new(IrcMessageSender { sender: Box::new(IrcMessageSender {
irc: IrcServerWrapper::new(&server), irc: IrcClientWrapper::new(&server),
channel: name.to_owned() channel: name.to_owned()
}) })
}) })
} }
struct IrcServerWrapper { struct IrcClientWrapper {
server: IrcServer, client: IrcClient,
thread_local: CachedThreadLocal<IrcServer> thread_local: CachedThreadLocal<IrcClient>
} }
impl IrcServerWrapper { impl IrcClientWrapper {
pub fn new (server: &IrcServer) -> IrcServerWrapper { pub fn new (client: &IrcClient) -> IrcClientWrapper {
IrcServerWrapper { IrcClientWrapper {
server: server.clone(), client: client.clone(),
thread_local: CachedThreadLocal::new() thread_local: CachedThreadLocal::new()
} }
} }
pub fn get (&self) -> &IrcServer { pub fn get (&self) -> &IrcClient {
self.thread_local.get_or(|| Box::new(self.server.clone())) self.thread_local.get_or(|| Box::new(self.client.clone()))
} }
} }
unsafe impl Sync for IrcServerWrapper {} unsafe impl Sync for IrcClientWrapper {}
impl EventLoop for IrcHandler { impl EventLoop for IrcHandler {
fn run (&self, sender: Box<ExtSender<event::Event>>, receiver: Receiver<Arc<event::Envelope>>) { fn run (&self, sender: Box<ExtSender<event::Event>>, receiver: Receiver<Arc<event::Envelope>>) {
let server = IrcServer::from_config(self.config.clone()).unwrap(); let client = IrcClient::from_config(self.config.clone()).unwrap();
server.identify().unwrap(); client.identify().unwrap();
crossbeam::scope(|scope| { crossbeam::scope(|scope| {
let server_sender = server.clone(); let client_sender = client.clone();
scope.spawn(move || { scope.spawn(move || {
loop { loop {
if let Ok(envelope) = receiver.recv() { if let Ok(envelope) = receiver.recv() {
if let event::Event::Message { ref message } = envelope.event { if let event::Event::Message { ref message } = envelope.event {
if let Some(ref channel) = message.channel { if let Some(ref channel) = message.channel {
server_sender.send_privmsg(&channel.name, &message.content); if let Err(error) = client_sender.send_privmsg(&channel.name, &message.content) {
error!("Failed to send IRC message: {}", error);
}
} }
} }
} else { } else {
@ -121,34 +122,32 @@ impl EventLoop for IrcHandler {
} }
}); });
for server_message in server.iter() { client.for_each_incoming(|irc_message| {
if let Ok(irc_message) = server_message { match irc_message.command {
match irc_message.command { Command::PRIVMSG(channel, message) => {
Command::PRIVMSG(channel, message) => { if let Some(author) = make_user(&irc_message.prefix, &client) {
if let Some(author) = make_user(&irc_message.prefix, &server) { let message = Message {
let message = Message { author: author,
author: author, content: message,
content: message, channel: Some(Channel {
channel: Some(Channel { name: channel.clone(),
name: channel.clone(), description: "".to_owned(),
description: "".to_owned(), topic: "".to_owned(),
topic: "".to_owned(), sender: Box::new(IrcMessageSender {
sender: Box::new(IrcMessageSender { irc: IrcClientWrapper::new(&client),
irc: IrcServerWrapper::new(&server), channel: channel.clone()
channel: channel.clone()
})
}) })
}; })
};
if let Err(err) = sender.send(event::Event::Message { message: message }) { if let Err(err) = sender.send(event::Event::Message { message: message }) {
error!("Error sending message event: {:?}", err) error!("Error sending message event: {:?}", err)
}
} }
}, }
_ => {} },
} _ => {}
} }
} }).unwrap();
}); });
} }
} }