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::data::command::Command;
use modules::EventLoop;
use toml::value::Table;
@ -50,7 +49,7 @@ impl IrcHandler {
}
pub struct IrcMessageSender {
irc: IrcServerWrapper,
irc: IrcClientWrapper,
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 {
name: name.to_owned(),
sender: Box::new(IrcMessageSender {
irc: IrcServerWrapper::new(&server),
irc: IrcClientWrapper::new(&server),
channel: name.to_owned()
})
})
}
struct IrcServerWrapper {
server: IrcServer,
thread_local: CachedThreadLocal<IrcServer>
struct IrcClientWrapper {
client: IrcClient,
thread_local: CachedThreadLocal<IrcClient>
}
impl IrcServerWrapper {
pub fn new (server: &IrcServer) -> IrcServerWrapper {
IrcServerWrapper {
server: server.clone(),
impl IrcClientWrapper {
pub fn new (client: &IrcClient) -> IrcClientWrapper {
IrcClientWrapper {
client: client.clone(),
thread_local: CachedThreadLocal::new()
}
}
pub fn get (&self) -> &IrcServer {
self.thread_local.get_or(|| Box::new(self.server.clone()))
pub fn get (&self) -> &IrcClient {
self.thread_local.get_or(|| Box::new(self.client.clone()))
}
}
unsafe impl Sync for IrcServerWrapper {}
unsafe impl Sync for IrcClientWrapper {}
impl EventLoop for IrcHandler {
fn run (&self, sender: Box<ExtSender<event::Event>>, receiver: Receiver<Arc<event::Envelope>>) {
let server = IrcServer::from_config(self.config.clone()).unwrap();
server.identify().unwrap();
let client = IrcClient::from_config(self.config.clone()).unwrap();
client.identify().unwrap();
crossbeam::scope(|scope| {
let server_sender = server.clone();
let client_sender = client.clone();
scope.spawn(move || {
loop {
if let Ok(envelope) = receiver.recv() {
if let event::Event::Message { ref message } = envelope.event {
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 {
@ -121,11 +122,10 @@ impl EventLoop for IrcHandler {
}
});
for server_message in server.iter() {
if let Ok(irc_message) = server_message {
client.for_each_incoming(|irc_message| {
match irc_message.command {
Command::PRIVMSG(channel, message) => {
if let Some(author) = make_user(&irc_message.prefix, &server) {
if let Some(author) = make_user(&irc_message.prefix, &client) {
let message = Message {
author: author,
content: message,
@ -134,7 +134,7 @@ impl EventLoop for IrcHandler {
description: "".to_owned(),
topic: "".to_owned(),
sender: Box::new(IrcMessageSender {
irc: IrcServerWrapper::new(&server),
irc: IrcClientWrapper::new(&client),
channel: channel.clone()
})
})
@ -147,8 +147,7 @@ impl EventLoop for IrcHandler {
},
_ => {}
}
}
}
}).unwrap();
});
}
}