simplify the presence plugin using xmpp-parsers

This commit is contained in:
Emmanuel Gil Peyrot 2017-05-27 16:37:21 +01:00
parent ca882fd13a
commit 8e7b7ae31c
2 changed files with 23 additions and 79 deletions

View file

@ -4,7 +4,7 @@ use xmpp::jid::Jid;
use xmpp::client::ClientBuilder; use xmpp::client::ClientBuilder;
use xmpp::plugins::stanza::StanzaPlugin; use xmpp::plugins::stanza::StanzaPlugin;
use xmpp::plugins::messaging::{MessagingPlugin, MessageEvent}; use xmpp::plugins::messaging::{MessagingPlugin, MessageEvent};
use xmpp::plugins::presence::{PresencePlugin, Show}; use xmpp::plugins::presence::{PresencePlugin, Type};
use xmpp::plugins::ping::{PingPlugin, PingEvent}; use xmpp::plugins::ping::{PingPlugin, PingEvent};
use std::env; use std::env;
@ -20,7 +20,7 @@ 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.plugin::<PresencePlugin>().set_presence(Show::Available, None).unwrap(); client.plugin::<PresencePlugin>().set_presence(Type::Available, None, None).unwrap();
client.main().unwrap(); client.main().unwrap();
/*loop { /*loop {
let event = client.next_event().unwrap(); let event = client.next_event().unwrap();

View file

@ -1,56 +1,9 @@
use std::collections::BTreeMap;
use error::Error; use error::Error;
use plugin::PluginProxy; use plugin::PluginProxy;
use minidom::Element; pub use xmpp_parsers::presence::{Presence, PresenceType as Type, Show};
use ns;
use std::fmt;
use std::str::FromStr;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Show {
Available,
Away,
ExtendedAway,
DoNotDisturb,
Chat,
Unavailable,
}
impl fmt::Display for Show {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match *self {
Show::Away => write!(fmt, "away"),
Show::ExtendedAway => write!(fmt, "xa"),
Show::DoNotDisturb => write!(fmt, "dnd"),
Show::Chat => write!(fmt, "chat"),
// will never be seen inside a <show>, maybe should crash?
Show::Available => write!(fmt, "available"),
Show::Unavailable => write!(fmt, "unavailable"),
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct InvalidShow;
impl FromStr for Show {
type Err = InvalidShow;
fn from_str(s: &str) -> Result<Show, InvalidShow> {
Ok(match s {
"away" => Show::Away,
"xa" => Show::ExtendedAway,
"dnd" => Show::DoNotDisturb,
"chat" => Show::Chat,
_ => { return Err(InvalidShow); }
})
}
}
pub struct PresencePlugin { pub struct PresencePlugin {
proxy: PluginProxy, proxy: PluginProxy,
@ -63,33 +16,24 @@ impl PresencePlugin {
} }
} }
pub fn set_presence(&self, show: Show, status: Option<String>) -> Result<(), Error> { pub fn set_presence(&self, type_: Type, show: Option<Show>, status: Option<String>) -> Result<(), Error> {
if show == Show::Unavailable { let presence = Presence {
self.proxy.send(Element::builder("presence") from: None,
.ns(ns::CLIENT) to: None,
.attr("type", "unavailable") id: None,
.build()); type_: type_,
} show: show,
else { priority: 0i8,
let mut stanza = Element::builder("presence") statuses: {
.ns(ns::CLIENT) let mut statuses = BTreeMap::new();
.build(); if let Some(status) = status {
if let Some(stat) = status { statuses.insert(String::new(), status);
let elem = Element::builder("status") }
.ns(ns::CLIENT) statuses
.append(stat) },
.build(); payloads: vec!(),
stanza.append_child(elem); };
} self.proxy.send(presence.into());
if show != Show::Available {
let mut elem = Element::builder("show")
.ns(ns::CLIENT)
.build();
elem.append_text_node(show.to_string());
stanza.append_child(elem);
}
self.proxy.send(stanza);
}
Ok(()) Ok(())
} }
} }