add register_handler to Client

This commit is contained in:
lumi 2017-05-27 18:01:01 +02:00
parent c326d5b07e
commit 11c99ec387
2 changed files with 13 additions and 11 deletions

View file

@ -5,6 +5,7 @@ use xmpp::client::ClientBuilder;
use xmpp::plugins::messaging::{MessagingPlugin, MessageEvent}; use xmpp::plugins::messaging::{MessagingPlugin, MessageEvent};
use xmpp::plugins::presence::{PresencePlugin, Show}; use xmpp::plugins::presence::{PresencePlugin, Show};
use xmpp::plugins::ping::{PingPlugin, PingEvent}; use xmpp::plugins::ping::{PingPlugin, PingEvent};
use xmpp::event::{Priority, Propagation};
use std::env; use std::env;
@ -18,16 +19,10 @@ fn main() {
client.register_plugin(MessagingPlugin::new()); client.register_plugin(MessagingPlugin::new());
client.register_plugin(PresencePlugin::new()); client.register_plugin(PresencePlugin::new());
client.register_plugin(PingPlugin::new()); client.register_plugin(PingPlugin::new());
client.register_handler(Priority::Max, |e: &MessageEvent| {
println!("{:?}", e);
Propagation::Continue
});
client.plugin::<PresencePlugin>().set_presence(Show::Available, None).unwrap(); client.plugin::<PresencePlugin>().set_presence(Show::Available, None).unwrap();
client.main().unwrap(); client.main().unwrap();
/*loop {
let event = client.next_event().unwrap();
if let Some(evt) = event.downcast::<MessageEvent>() {
println!("{:?}", evt);
}
else if let Some(evt) = event.downcast::<PingEvent>() {
println!("{:?}", evt);
client.plugin::<PingPlugin>().reply_ping(evt);
}
}*/
} }

View file

@ -11,7 +11,7 @@ use sasl::common::{Credentials as SaslCredentials, Identity, Secret, ChannelBind
use sasl::common::scram::{Sha1, Sha256}; use sasl::common::scram::{Sha1, Sha256};
use components::sasl_error::SaslError; use components::sasl_error::SaslError;
use util::FromElement; use util::FromElement;
use event::{Dispatcher, Propagation, SendElement, ReceiveElement, Priority}; use event::{Event, Dispatcher, Propagation, SendElement, ReceiveElement, Priority};
use base64; use base64;
@ -128,6 +128,13 @@ impl Client {
} }
} }
pub fn register_handler<E, F>(&mut self, pri: Priority, func: F)
where
E: Event,
F: Fn(&E) -> Propagation + 'static {
self.dispatcher.lock().unwrap().register(pri, func);
}
/// Returns the plugin given by the type parameter, if it exists, else panics. /// Returns the plugin given by the type parameter, if it exists, else panics.
pub fn plugin<P: Plugin>(&self) -> &P { pub fn plugin<P: Plugin>(&self) -> &P {
self.plugins.get(&TypeId::of::<P>()) self.plugins.get(&TypeId::of::<P>())