expose a sender on the Module so we can send events directly to the module
This commit is contained in:
parent
6acffb59cc
commit
9295b603aa
@ -1,5 +1,6 @@
|
|||||||
pub mod filter;
|
pub mod filter;
|
||||||
|
|
||||||
|
use toml::value::Table;
|
||||||
use {Message, Channel, User};
|
use {Message, Channel, User};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -14,7 +15,9 @@ pub enum Event {
|
|||||||
UserKick { channel: Channel, user: User }, // A usre is kicked from a channel
|
UserKick { channel: Channel, user: User }, // A usre is kicked from a channel
|
||||||
UserBan { channel: Channel, user: User }, // A user is banned from a channel
|
UserBan { channel: Channel, user: User }, // A user is banned from a channel
|
||||||
|
|
||||||
TopicChange { channel: Channel } // Channel topic is changed
|
TopicChange { channel: Channel }, // Channel topic is changed,
|
||||||
|
|
||||||
|
Configure { configuration: Table } // Request to reconfigure a module
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -104,6 +104,7 @@ impl Tenquestionmarks {
|
|||||||
module.run(Box::new(mapped_sender), module_receiver);
|
module.run(Box::new(mapped_sender), module_receiver);
|
||||||
info!("Event loop thread for \"{}\" is exiting", key);
|
info!("Event loop thread for \"{}\" is exiting", key);
|
||||||
});
|
});
|
||||||
|
module.set_sender(&module_sender);
|
||||||
(&key[..], module_sender)
|
(&key[..], module_sender)
|
||||||
}).collect();
|
}).collect();
|
||||||
|
|
||||||
|
@ -37,8 +37,8 @@ fn main () {
|
|||||||
Ok(tqm) => {
|
Ok(tqm) => {
|
||||||
info!("tenquestionmarks initialized successfully");
|
info!("tenquestionmarks initialized successfully");
|
||||||
crossbeam::scope(|scope| {
|
crossbeam::scope(|scope| {
|
||||||
//scope.spawn(|| {
|
//scope.spawn(move || {
|
||||||
// tqm.reconfigure(&read_config_from_file(&config_file_name));
|
// tqm_mut.reconfigure(&read_config_from_file(&config_file_name));
|
||||||
//});
|
//});
|
||||||
|
|
||||||
tqm.run();
|
tqm.run();
|
||||||
|
@ -15,6 +15,8 @@ use modules::echobox::EchoboxModule;
|
|||||||
use modules::autolink::AutolinkModule;
|
use modules::autolink::AutolinkModule;
|
||||||
use modules::logger::LoggerModule;
|
use modules::logger::LoggerModule;
|
||||||
|
|
||||||
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
pub struct ModuleLoader {
|
pub struct ModuleLoader {
|
||||||
types: BTreeMap<&'static str, fn(&Table, &Table) -> Box<EventLoop>>
|
types: BTreeMap<&'static str, fn(&Table, &Table) -> Box<EventLoop>>
|
||||||
}
|
}
|
||||||
@ -68,7 +70,8 @@ impl ModuleLoader {
|
|||||||
Some(constructor) => Result::Ok(Module {
|
Some(constructor) => Result::Ok(Module {
|
||||||
module_type: module_type.to_owned(),
|
module_type: module_type.to_owned(),
|
||||||
config: module_configuration.clone(),
|
config: module_configuration.clone(),
|
||||||
event_loop: constructor(general_configuration, module_configuration)
|
event_loop: constructor(general_configuration, module_configuration),
|
||||||
|
sender: Mutex::new(None)
|
||||||
}),
|
}),
|
||||||
None => Result::Err(ModuleLoaderError { message: format!("No such module type: {}", module_type) })
|
None => Result::Err(ModuleLoaderError { message: format!("No such module type: {}", module_type) })
|
||||||
}
|
}
|
||||||
|
@ -12,8 +12,8 @@ pub mod loader;
|
|||||||
|
|
||||||
use event::{Event, Envelope};
|
use event::{Event, Envelope};
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::{Mutex, Arc};
|
||||||
use std::sync::mpsc::Receiver;
|
use std::sync::mpsc::{Sender, Receiver};
|
||||||
use transformable_channels::mpsc::ExtSender;
|
use transformable_channels::mpsc::ExtSender;
|
||||||
|
|
||||||
use toml::value::Table;
|
use toml::value::Table;
|
||||||
@ -21,6 +21,7 @@ use toml::value::Table;
|
|||||||
pub struct Module {
|
pub struct Module {
|
||||||
event_loop: Box<EventLoop>,
|
event_loop: Box<EventLoop>,
|
||||||
module_type: String,
|
module_type: String,
|
||||||
|
sender: Mutex<Option<Sender<Arc<Envelope>>>>,
|
||||||
pub config: Table,
|
pub config: Table,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,6 +35,20 @@ impl Module {
|
|||||||
self.config = configuration;
|
self.config = configuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn send (&self, event: Envelope) {
|
||||||
|
if let Ok(sender_lock) = self.sender.lock() {
|
||||||
|
if let Some(ref sender) = *sender_lock {
|
||||||
|
sender.send(Arc::new(event));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_sender (&self, sender: &Sender<Arc<Envelope>>) {
|
||||||
|
if let Ok(ref mut sender_lock) = self.sender.lock() {
|
||||||
|
**sender_lock = Some(sender.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn parents (&self) -> Vec<String> {
|
pub fn parents (&self) -> Vec<String> {
|
||||||
self.config.get("parents")
|
self.config.get("parents")
|
||||||
.and_then(|value| value.as_array())
|
.and_then(|value| value.as_array())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user