2019-03-21 17:41:29 +00:00
|
|
|
// Copyright (c) 2019 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
|
|
|
|
//
|
|
|
|
// 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/.
|
|
|
|
|
2019-07-05 16:59:05 +00:00
|
|
|
use futures::prelude::*;
|
2019-03-21 17:41:29 +00:00
|
|
|
use std::env::args;
|
|
|
|
use std::process::exit;
|
|
|
|
use tokio::runtime::current_thread::Runtime;
|
2019-09-11 14:11:32 +00:00
|
|
|
use xmpp_parsers::{message::MessageType, Jid};
|
2019-03-21 17:41:29 +00:00
|
|
|
use xmpp::{ClientBuilder, ClientType, ClientFeature, Event};
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let args: Vec<String> = args().collect();
|
2019-07-25 13:11:39 +00:00
|
|
|
if args.len() != 3 {
|
|
|
|
println!("Usage: {} <jid> <password>", args[0]);
|
2019-03-21 17:41:29 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
let jid = &args[1];
|
|
|
|
let password = &args[2];
|
|
|
|
|
|
|
|
// tokio_core context
|
|
|
|
let mut rt = Runtime::new().unwrap();
|
|
|
|
|
|
|
|
// Client instance
|
2019-07-05 16:59:05 +00:00
|
|
|
let (mut agent, stream) = ClientBuilder::new(jid, password)
|
2019-03-21 17:41:29 +00:00
|
|
|
.set_client(ClientType::Bot, "xmpp-rs")
|
|
|
|
.set_website("https://gitlab.com/xmpp-rs/xmpp-rs")
|
2019-07-25 13:11:39 +00:00
|
|
|
.set_default_nick("bot")
|
2019-03-21 17:41:29 +00:00
|
|
|
.enable_feature(ClientFeature::Avatars)
|
2019-06-01 15:56:46 +00:00
|
|
|
.enable_feature(ClientFeature::ContactList)
|
2019-07-25 13:11:39 +00:00
|
|
|
.enable_feature(ClientFeature::JoinRooms)
|
2019-07-05 16:59:05 +00:00
|
|
|
.build()
|
2019-03-21 17:41:29 +00:00
|
|
|
.unwrap();
|
|
|
|
|
2019-07-05 16:59:05 +00:00
|
|
|
// We return either Some(Error) if an error was encountered
|
|
|
|
// or None, if we were simply disconnected
|
|
|
|
let handler = stream.map_err(Some).for_each(|evt: Event| {
|
2019-03-21 17:41:29 +00:00
|
|
|
match evt {
|
|
|
|
Event::Online => {
|
|
|
|
println!("Online.");
|
|
|
|
},
|
|
|
|
Event::Disconnected => {
|
|
|
|
println!("Disconnected.");
|
2019-07-05 16:59:05 +00:00
|
|
|
return Err(None);
|
2019-03-21 17:41:29 +00:00
|
|
|
},
|
2019-06-01 15:56:46 +00:00
|
|
|
Event::ContactAdded(contact) => {
|
2019-07-25 13:11:39 +00:00
|
|
|
println!("Contact {} added.", contact.jid);
|
2019-06-01 15:56:46 +00:00
|
|
|
},
|
|
|
|
Event::ContactRemoved(contact) => {
|
2019-07-25 13:11:39 +00:00
|
|
|
println!("Contact {} removed.", contact.jid);
|
2019-06-01 15:56:46 +00:00
|
|
|
},
|
|
|
|
Event::ContactChanged(contact) => {
|
2019-07-25 13:11:39 +00:00
|
|
|
println!("Contact {} changed.", contact.jid);
|
|
|
|
},
|
|
|
|
Event::OpenRoomBookmark(bookmark) => {
|
|
|
|
println!("Joining room “{}” ({})…", bookmark.name, bookmark.jid);
|
|
|
|
agent.join_room(bookmark.jid, bookmark.nick, bookmark.password, "en", "Yet another bot!");
|
2019-06-01 15:56:46 +00:00
|
|
|
},
|
2019-03-21 17:41:29 +00:00
|
|
|
Event::RoomJoined(jid) => {
|
|
|
|
println!("Joined room {}.", jid);
|
2019-09-11 14:11:32 +00:00
|
|
|
agent.send_message(Jid::Bare(jid), MessageType::Groupchat, "en", "Hello world!");
|
2019-03-21 17:41:29 +00:00
|
|
|
},
|
2019-07-25 13:11:39 +00:00
|
|
|
Event::RoomLeft(jid) => {
|
|
|
|
println!("Left room {}.", jid);
|
|
|
|
},
|
2019-03-21 17:41:29 +00:00
|
|
|
Event::AvatarRetrieved(jid, path) => {
|
|
|
|
println!("Received avatar for {} in {}.", jid, path);
|
|
|
|
},
|
|
|
|
}
|
|
|
|
Ok(())
|
2019-07-05 16:59:05 +00:00
|
|
|
});
|
2019-03-21 17:41:29 +00:00
|
|
|
|
2019-07-05 16:59:05 +00:00
|
|
|
rt.block_on(handler).unwrap_or_else(|e| match e {
|
|
|
|
Some(e) => println!("Error: {:?}", e),
|
|
|
|
None => println!("Disconnected."),
|
|
|
|
});
|
2019-03-21 17:41:29 +00:00
|
|
|
}
|