rewrite the ping plugin to make it use the stanza plugin
This commit is contained in:
parent
8e7b7ae31c
commit
c48086bc9c
1 changed files with 34 additions and 27 deletions
|
@ -1,14 +1,17 @@
|
|||
use std::convert::TryFrom;
|
||||
|
||||
use plugin::PluginProxy;
|
||||
use event::{Event, Priority, Propagation, ReceiveElement};
|
||||
use minidom::Element;
|
||||
use event::{Event, Priority, Propagation};
|
||||
use error::Error;
|
||||
use jid::Jid;
|
||||
use ns;
|
||||
|
||||
use plugins::stanza::Iq;
|
||||
use xmpp_parsers::iq::{IqType, IqPayload};
|
||||
use xmpp_parsers::ping::Ping;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct PingEvent {
|
||||
pub from: Jid,
|
||||
pub to: Jid,
|
||||
pub id: String,
|
||||
}
|
||||
|
||||
|
@ -26,39 +29,43 @@ impl PingPlugin {
|
|||
}
|
||||
|
||||
pub fn send_ping(&self, to: &Jid) -> Result<(), Error> {
|
||||
let mut elem = Element::builder("iq")
|
||||
.attr("type", "get")
|
||||
.attr("to", to.to_string())
|
||||
.build();
|
||||
elem.append_child(Element::builder("ping").ns(ns::PING).build());
|
||||
self.proxy.send(elem);
|
||||
let to = to.clone();
|
||||
self.proxy.send(Iq {
|
||||
from: None,
|
||||
to: Some(to),
|
||||
// TODO: use a generic way to generate ids.
|
||||
id: Some(String::from("id")),
|
||||
payload: IqType::Get(IqPayload::Ping(Ping).into()),
|
||||
}.into());
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn reply_ping(&self, event: &PingEvent) {
|
||||
let reply = Element::builder("iq")
|
||||
.attr("type", "result")
|
||||
.attr("to", event.from.to_string())
|
||||
.attr("id", event.id.to_string())
|
||||
.build();
|
||||
self.proxy.send(reply);
|
||||
}
|
||||
|
||||
fn handle_receive_element(&self, evt: &ReceiveElement) -> Propagation {
|
||||
let elem = &evt.0;
|
||||
if elem.is("iq", ns::CLIENT) && elem.attr("type") == Some("get") {
|
||||
if elem.has_child("ping", ns::PING) {
|
||||
fn handle_iq(&self, iq: &Iq) -> Propagation {
|
||||
let iq = iq.clone();
|
||||
if let IqType::Get(payload) = iq.payload {
|
||||
// TODO: use an intermediate plugin to parse this payload.
|
||||
if let Ok(IqPayload::Ping(_)) = IqPayload::try_from(payload) {
|
||||
self.proxy.dispatch(PingEvent { // TODO: safety!!!
|
||||
from: elem.attr("from").unwrap().parse().unwrap(),
|
||||
to: elem.attr("to").unwrap().parse().unwrap(),
|
||||
id: elem.attr("id").unwrap().parse().unwrap(),
|
||||
from: iq.from.unwrap(),
|
||||
id: iq.id.unwrap(),
|
||||
});
|
||||
}
|
||||
}
|
||||
Propagation::Continue
|
||||
}
|
||||
|
||||
fn reply_ping(&self, ping: &PingEvent) -> Propagation {
|
||||
self.proxy.send(Iq {
|
||||
from: None,
|
||||
to: Some(ping.from.to_owned()),
|
||||
id: Some(ping.id.to_owned()),
|
||||
payload: IqType::Result(None),
|
||||
}.into());
|
||||
Propagation::Continue
|
||||
}
|
||||
}
|
||||
|
||||
impl_plugin!(PingPlugin, proxy, [
|
||||
(ReceiveElement, Priority::Default) => handle_receive_element,
|
||||
(Iq, Priority::Default) => handle_iq,
|
||||
(PingEvent, Priority::Default) => reply_ping,
|
||||
]);
|
||||
|
|
Loading…
Reference in a new issue