hello_bot.rs

 1// Copyright (c) 2019 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
 2//
 3// This Source Code Form is subject to the terms of the Mozilla Public
 4// License, v. 2.0. If a copy of the MPL was not distributed with this
 5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
 6
 7use futures::prelude::*;
 8use std::env::args;
 9use std::process::exit;
10use tokio::runtime::current_thread::Runtime;
11use xmpp_parsers::{message::MessageType, Jid};
12use xmpp::{ClientBuilder, ClientType, ClientFeature, Event};
13
14fn main() {
15    let args: Vec<String> = args().collect();
16    if args.len() != 3 {
17        println!("Usage: {} <jid> <password>", args[0]);
18        exit(1);
19    }
20    let jid = &args[1];
21    let password = &args[2];
22
23    // tokio_core context
24    let mut rt = Runtime::new().unwrap();
25
26    // Client instance
27    let (mut agent, stream) = ClientBuilder::new(jid, password)
28        .set_client(ClientType::Bot, "xmpp-rs")
29        .set_website("https://gitlab.com/xmpp-rs/xmpp-rs")
30        .set_default_nick("bot")
31        .enable_feature(ClientFeature::Avatars)
32        .enable_feature(ClientFeature::ContactList)
33        .enable_feature(ClientFeature::JoinRooms)
34        .build()
35        .unwrap();
36
37    // We return either Some(Error) if an error was encountered
38    // or None, if we were simply disconnected
39    let handler = stream.map_err(Some).for_each(|evt: Event| {
40        match evt {
41            Event::Online => {
42                println!("Online.");
43            },
44            Event::Disconnected => {
45                println!("Disconnected.");
46                return Err(None);
47            },
48            Event::ContactAdded(contact) => {
49                println!("Contact {} added.", contact.jid);
50            },
51            Event::ContactRemoved(contact) => {
52                println!("Contact {} removed.", contact.jid);
53            },
54            Event::ContactChanged(contact) => {
55                println!("Contact {} changed.", contact.jid);
56            },
57            Event::OpenRoomBookmark(bookmark) => {
58                println!("Joining room “{}” ({})…", bookmark.name, bookmark.jid);
59                agent.join_room(bookmark.jid, bookmark.nick, bookmark.password, "en", "Yet another bot!");
60            },
61            Event::RoomJoined(jid) => {
62                println!("Joined room {}.", jid);
63                agent.send_message(Jid::Bare(jid), MessageType::Groupchat, "en", "Hello world!");
64            },
65            Event::RoomLeft(jid) => {
66                println!("Left room {}.", jid);
67            },
68            Event::AvatarRetrieved(jid, path) => {
69                println!("Received avatar for {} in {}.", jid, path);
70            },
71        }
72        Ok(())
73    });
74
75    rt.block_on(handler).unwrap_or_else(|e| match e {
76        Some(e) => println!("Error: {:?}", e),
77        None => println!("Disconnected."),
78    });
79}