Add contact list support
This commit is contained in:
parent
92386fc488
commit
08af035eb1
2 changed files with 24 additions and 1 deletions
|
@ -33,6 +33,7 @@ fn main() {
|
||||||
.set_client(ClientType::Bot, "xmpp-rs")
|
.set_client(ClientType::Bot, "xmpp-rs")
|
||||||
.set_website("https://gitlab.com/xmpp-rs/xmpp-rs")
|
.set_website("https://gitlab.com/xmpp-rs/xmpp-rs")
|
||||||
.enable_feature(ClientFeature::Avatars)
|
.enable_feature(ClientFeature::Avatars)
|
||||||
|
.enable_feature(ClientFeature::ContactList)
|
||||||
.build(value_tx)
|
.build(value_tx)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
@ -47,6 +48,15 @@ fn main() {
|
||||||
println!("Disconnected.");
|
println!("Disconnected.");
|
||||||
return Err(());
|
return Err(());
|
||||||
},
|
},
|
||||||
|
Event::ContactAdded(contact) => {
|
||||||
|
println!("Contact {:?} added.", contact);
|
||||||
|
},
|
||||||
|
Event::ContactRemoved(contact) => {
|
||||||
|
println!("Contact {:?} removed.", contact);
|
||||||
|
},
|
||||||
|
Event::ContactChanged(contact) => {
|
||||||
|
println!("Contact {:?} changed.", contact);
|
||||||
|
},
|
||||||
Event::RoomJoined(jid) => {
|
Event::RoomJoined(jid) => {
|
||||||
println!("Joined room {}.", jid);
|
println!("Joined room {}.", jid);
|
||||||
agent.send_message(jid.into_bare_jid(), MessageType::Groupchat, "en", "Hello world!");
|
agent.send_message(jid.into_bare_jid(), MessageType::Groupchat, "en", "Hello world!");
|
||||||
|
|
15
src/lib.rs
15
src/lib.rs
|
@ -27,6 +27,7 @@ use xmpp_parsers::{
|
||||||
event::PubSubEvent,
|
event::PubSubEvent,
|
||||||
pubsub::PubSub,
|
pubsub::PubSub,
|
||||||
},
|
},
|
||||||
|
roster::{Roster, Item as RosterItem},
|
||||||
stanza_error::{StanzaError, ErrorType, DefinedCondition},
|
stanza_error::{StanzaError, ErrorType, DefinedCondition},
|
||||||
Jid, JidParseError, TryFrom,
|
Jid, JidParseError, TryFrom,
|
||||||
};
|
};
|
||||||
|
@ -59,11 +60,15 @@ impl ToString for ClientType {
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
pub enum ClientFeature {
|
pub enum ClientFeature {
|
||||||
Avatars,
|
Avatars,
|
||||||
|
ContactList,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum Event {
|
pub enum Event {
|
||||||
Online,
|
Online,
|
||||||
Disconnected,
|
Disconnected,
|
||||||
|
ContactAdded(RosterItem),
|
||||||
|
ContactRemoved(RosterItem),
|
||||||
|
ContactChanged(RosterItem),
|
||||||
AvatarRetrieved(Jid, String),
|
AvatarRetrieved(Jid, String),
|
||||||
RoomJoined(Jid),
|
RoomJoined(Jid),
|
||||||
}
|
}
|
||||||
|
@ -158,6 +163,9 @@ impl ClientBuilder<'_> {
|
||||||
sender_tx.unbounded_send(packet)
|
sender_tx.unbounded_send(packet)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
app_tx.unbounded_send(Event::Online).unwrap();
|
app_tx.unbounded_send(Event::Online).unwrap();
|
||||||
|
let iq = Iq::from_get("roster", Roster { ver: None, items: vec![] })
|
||||||
|
.into();
|
||||||
|
sender_tx.unbounded_send(Packet::Stanza(iq)).unwrap();
|
||||||
}
|
}
|
||||||
TokioXmppEvent::Disconnected => {
|
TokioXmppEvent::Disconnected => {
|
||||||
app_tx.unbounded_send(Event::Disconnected).unwrap();
|
app_tx.unbounded_send(Event::Disconnected).unwrap();
|
||||||
|
@ -186,7 +194,12 @@ impl ClientBuilder<'_> {
|
||||||
send_error(iq.from.unwrap(), iq.id, ErrorType::Cancel, DefinedCondition::ServiceUnavailable, "No handler defined for this kind of iq.");
|
send_error(iq.from.unwrap(), iq.id, ErrorType::Cancel, DefinedCondition::ServiceUnavailable, "No handler defined for this kind of iq.");
|
||||||
}
|
}
|
||||||
} else if let IqType::Result(Some(payload)) = iq.payload {
|
} else if let IqType::Result(Some(payload)) = iq.payload {
|
||||||
if payload.is("pubsub", ns::PUBSUB) {
|
if payload.is("query", ns::ROSTER) {
|
||||||
|
let roster = Roster::try_from(payload).unwrap();
|
||||||
|
for item in roster.items.into_iter() {
|
||||||
|
app_tx.unbounded_send(Event::ContactAdded(item)).unwrap();
|
||||||
|
}
|
||||||
|
} else if payload.is("pubsub", ns::PUBSUB) {
|
||||||
let pubsub = PubSub::try_from(payload).unwrap();
|
let pubsub = PubSub::try_from(payload).unwrap();
|
||||||
let from =
|
let from =
|
||||||
iq.from.clone().unwrap_or(Jid::from_str(&jid).unwrap());
|
iq.from.clone().unwrap_or(Jid::from_str(&jid).unwrap());
|
||||||
|
|
Loading…
Reference in a new issue