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}