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 xmpp::{
  8    jid::BareJid,
  9    muc::room::{JoinRoomSettings, RoomMessageSettings},
 10    ClientBuilder, ClientFeature, ClientType, Event, RoomNick,
 11};
 12
 13use std::env::args;
 14use std::str::FromStr;
 15
 16#[tokio::main]
 17async fn main() -> Result<(), Option<()>> {
 18    env_logger::init();
 19
 20    let args: Vec<String> = args().collect();
 21    if args.len() < 3 {
 22        println!("Usage: {} <jid> <password> [ROOM...]", args[0]);
 23        return Err(None);
 24    }
 25
 26    let jid = BareJid::from_str(&args[1]).expect(&format!("Invalid JID: {}", &args[1]));
 27    let password = &args[2];
 28
 29    // Figure out which rooms to join to say hello
 30    let mut rooms: Vec<BareJid> = Vec::new();
 31    let mut counter = 3;
 32    if args.len() > 3 {
 33        while counter < args.len() {
 34            match BareJid::from_str(&args[counter]) {
 35                Ok(jid) => rooms.push(jid),
 36                Err(e) => {
 37                    log::error!("Requested room {} is not a valid JID: {e}", args[counter]);
 38                    std::process::exit(1);
 39                }
 40            }
 41            counter += 1;
 42        }
 43    }
 44
 45    let nick = RoomNick::from_str("bot").unwrap();
 46
 47    // Client instance
 48    let mut client = ClientBuilder::new(jid, password)
 49        .set_client(ClientType::Bot, "xmpp-rs")
 50        .set_website("https://gitlab.com/xmpp-rs/xmpp-rs")
 51        .set_default_nick(nick)
 52        .enable_feature(ClientFeature::ContactList)
 53        .enable_feature(ClientFeature::JoinRooms)
 54        .build();
 55
 56    log::info!("Connecting...");
 57
 58    loop {
 59        for event in client.wait_for_events().await {
 60            match event {
 61                Event::Online => {
 62                    log::info!("Online.");
 63                    for room in &rooms {
 64                        log::info!("Joining room {} from CLI argument…", room);
 65                        client
 66                            .join_room(JoinRoomSettings {
 67                                room: room.clone(),
 68                                nick: None,
 69                                password: None,
 70                                status: Some(("en", "Yet another bot!")),
 71                            })
 72                            .await;
 73                    }
 74                }
 75                Event::Disconnected(e) => {
 76                    log::info!("Disconnected: {}.", e);
 77                }
 78                Event::ChatMessage(_id, jid, body, time_info) => {
 79                    log::info!(
 80                        "{} {}: {}",
 81                        time_info.received.time().format("%H:%M"),
 82                        jid,
 83                        body.0
 84                    );
 85                }
 86                Event::RoomJoined(jid) => {
 87                    log::info!("Joined room {}.", jid);
 88                    client
 89                        .send_room_message(RoomMessageSettings::new(jid, "Hello world!"))
 90                        .await;
 91                }
 92                Event::RoomMessage(_id, jid, nick, body, time_info) => {
 93                    println!(
 94                        "Message in room {} from {} at {}: {}",
 95                        jid, nick, time_info.received, body.0
 96                    );
 97                }
 98                _ => {
 99                    log::debug!("Unimplemented event:\n{:#?}", event);
100                }
101            }
102        }
103    }
104}