example_command_bot/
main.rs1#![recursion_limit = "256"]
2
3use std::{env, process::exit};
4
5use matrix_sdk::{
6 Client, Room, RoomState,
7 config::SyncSettings,
8 ruma::events::room::message::{
9 MessageType, OriginalSyncRoomMessageEvent, RoomMessageEventContent,
10 },
11};
12
13async fn on_room_message(event: OriginalSyncRoomMessageEvent, room: Room) {
14 if room.state() != RoomState::Joined {
15 return;
16 }
17 let MessageType::Text(text_content) = event.content.msgtype else {
18 return;
19 };
20
21 if text_content.body.contains("!party") {
22 let content = RoomMessageEventContent::text_plain("🎉🎊🥳 let's PARTY!! 🥳🎊🎉");
23
24 println!("sending");
25
26 room.send(content).await.unwrap();
28
29 println!("message sent");
30 }
31}
32
33async fn login_and_sync(
34 homeserver_url: String,
35 username: String,
36 password: String,
37) -> anyhow::Result<()> {
38 let client = Client::builder().homeserver_url(homeserver_url).build().await.unwrap();
42 client
43 .matrix_auth()
44 .login_username(&username, &password)
45 .initial_device_display_name("command bot")
46 .await?;
47
48 println!("logged in as {username}");
49
50 let response = client.sync_once(SyncSettings::default()).await.unwrap();
53 client.add_event_handler(on_room_message);
57
58 let settings = SyncSettings::default().token(response.next_batch);
61 client.sync(settings).await?;
64
65 Ok(())
66}
67
68#[tokio::main]
69async fn main() -> anyhow::Result<()> {
70 tracing_subscriber::fmt::init();
71
72 let (Some(homeserver_url), Some(username), Some(password)) =
73 (env::args().nth(1), env::args().nth(2), env::args().nth(3))
74 else {
75 eprintln!("Usage: {} <homeserver_url> <username> <password>", env::args().next().unwrap());
76 exit(1)
77 };
78
79 login_and_sync(homeserver_url, username, password).await?;
80 Ok(())
81}