From f8cb6435909949669931bef8359443b5439a4cee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20=E2=80=9Cpep=E2=80=9D=20Buquet?= Date: Wed, 29 Apr 2020 23:28:57 +0200 Subject: [PATCH] xmpp: Add ChatMessage and GroupMessage events; API likely to change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Maxime “pep” Buquet --- xmpp-rs/examples/hello_bot.rs | 6 ++++++ xmpp-rs/src/lib.rs | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/xmpp-rs/examples/hello_bot.rs b/xmpp-rs/examples/hello_bot.rs index ce2e13e1747f2da199359cc46df51c0e62603a24..e3b8155d8571d5cc0bbb048fa4366819928e3333 100644 --- a/xmpp-rs/examples/hello_bot.rs +++ b/xmpp-rs/examples/hello_bot.rs @@ -51,6 +51,9 @@ async fn main() -> Result<(), Option<()>> { Event::ContactChanged(contact) => { println!("Contact {} changed.", contact.jid); } + Event::ChatMessage(jid, body) => { + println!("Message from {}: {}", jid, body.0); + } Event::JoinRoom(jid, conference) => { println!("Joining room {} ({:?})…", jid, conference.name); client @@ -78,6 +81,9 @@ async fn main() -> Result<(), Option<()>> { Event::RoomLeft(jid) => { println!("Left room {}.", jid); } + Event::RoomMessage(jid, nick, body) => { + println!("Message in room {} from {}: {}", jid, nick, body.0); + } Event::AvatarRetrieved(jid, path) => { println!("Received avatar for {} in {}.", jid, path); } diff --git a/xmpp-rs/src/lib.rs b/xmpp-rs/src/lib.rs index 8f7d17903a12ea2819695d5e9350326fdf126d29..fdf0faf22965eff0aaeee5d08d58967befb75258 100644 --- a/xmpp-rs/src/lib.rs +++ b/xmpp-rs/src/lib.rs @@ -65,6 +65,8 @@ pub enum ClientFeature { JoinRooms, } +pub type RoomNick = String; + #[derive(Debug)] pub enum Event { Online, @@ -74,11 +76,13 @@ pub enum Event { ContactChanged(RosterItem), #[cfg(feature = "avatars")] AvatarRetrieved(Jid, String), + ChatMessage(BareJid, Body), JoinRoom(BareJid, Conference), LeaveRoom(BareJid), LeaveAllRooms, RoomJoined(BareJid), RoomLeft(BareJid), + RoomMessage(BareJid, RoomNick, Body), } #[derive(Default)] @@ -87,6 +91,7 @@ pub struct ClientBuilder<'a> { password: &'a str, website: String, default_nick: String, + lang: Vec, disco: (ClientType, String), features: Vec, } @@ -98,6 +103,7 @@ impl ClientBuilder<'_> { password, website: String::from("https://gitlab.com/xmpp-rs/tokio-xmpp"), default_nick: String::from("xmpp-rs"), + lang: vec![String::from("en")], disco: (ClientType::default(), String::from("tokio-xmpp")), features: vec![], } @@ -118,6 +124,11 @@ impl ClientBuilder<'_> { self } + pub fn set_lang(mut self, lang: Vec) -> Self { + self.lang = lang; + self + } + pub fn enable_feature(mut self, feature: ClientFeature) -> Self { self.features.push(feature); self @@ -161,6 +172,7 @@ impl ClientBuilder<'_> { let agent = Agent { client, default_nick: Rc::new(RefCell::new(self.default_nick)), + lang: Rc::new(self.lang), disco, node, }; @@ -172,6 +184,7 @@ impl ClientBuilder<'_> { pub struct Agent { client: TokioXmppClient, default_nick: Rc>, + lang: Rc>, disco: DiscoInfoResult, node: String, } @@ -323,6 +336,26 @@ impl Agent { } else if stanza.is("message", "jabber:client") { let message = Message::try_from(stanza).unwrap(); let from = message.from.clone().unwrap(); + let langs: Vec<&str> = self.lang.iter().map(String::as_str).collect(); + match message.get_best_body(langs) { + Some((_lang, body)) => match message.type_ { + MessageType::Groupchat => { + let event = Event::RoomMessage( + from.clone().into(), + FullJid::try_from(from.clone()).unwrap().resource, + body.clone(), + ); + events.push(event) + } + MessageType::Chat | MessageType::Normal => { + let event = + Event::ChatMessage(from.clone().into(), body.clone()); + events.push(event) + } + _ => (), + }, + None => (), + } for child in message.payloads { if child.is("event", ns::PUBSUB_EVENT) { let new_events = pubsub::handle_event(&from, child, self).await;