// Copyright (c) 2019 Emmanuel Gil Peyrot // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. use futures::{Future, Stream, sync::mpsc}; use std::env::args; use std::process::exit; use std::str::FromStr; use tokio::runtime::current_thread::Runtime; use xmpp_parsers::{Jid, message::MessageType}; use xmpp::{ClientBuilder, ClientType, ClientFeature, Event}; fn main() { let args: Vec = args().collect(); if args.len() != 5 { println!("Usage: {} ", args[0]); exit(1); } let jid = &args[1]; let password = &args[2]; let room_jid = &args[3]; let nick: &str = &args[4]; // tokio_core context let mut rt = Runtime::new().unwrap(); let (value_tx, value_rx) = mpsc::unbounded(); // Client instance let (client, mut agent) = ClientBuilder::new(jid, password) .set_client(ClientType::Bot, "xmpp-rs") .set_website("https://gitlab.com/xmpp-rs/xmpp-rs") .enable_feature(ClientFeature::Avatars) .enable_feature(ClientFeature::ContactList) .build(value_tx) .unwrap(); let forwarder = value_rx.for_each(|evt: Event| { match evt { Event::Online => { println!("Online."); let room_jid = Jid::from_str(room_jid).unwrap().with_resource(nick); agent.join_room(room_jid, "en", "Yet another bot!"); }, Event::Disconnected => { println!("Disconnected."); 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) => { println!("Joined room {}.", jid); agent.send_message(jid.into_bare_jid(), MessageType::Groupchat, "en", "Hello world!"); }, Event::AvatarRetrieved(jid, path) => { println!("Received avatar for {} in {}.", jid, path); }, } Ok(()) }) .map_err(|e| println!("{:?}", e)); // Start polling match rt.block_on(client .select2(forwarder) .map(|_| ()) .map_err(|_| ()) ) { Ok(_) => (), Err(e) => { println!("Fatal: {:?}", e); () } } }