atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

Blame: examples/timeline/src/main.rs

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
#![recursion_limit = "256"]
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
use anyhow::Result;
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
use clap::Parser;
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
use futures_util::StreamExt;
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
use matrix_sdk::{Client, config::SyncSettings, ruma::OwnedRoomId};
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
use matrix_sdk_ui::timeline::RoomExt;
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
use url::Url;
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
#[derive(Parser, Debug)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
struct Cli {
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
    /// The homeserver to connect to.
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
    #[clap(value_parser)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
    homeserver: Url,
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
    /// The user name that should be used for the login.
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
    #[clap(value_parser)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
    user_name: String,
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
    /// The password that should be used for the login.
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
    #[clap(value_parser)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
    password: String,
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
    /// Set the proxy that should be used for the connection.
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
    #[clap(short, long)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
    proxy: Option<Url>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
    /// Enable verbose logging output.
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
    #[clap(short, long, action)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
    verbose: bool,
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
    /// The room id that we should listen for the,
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
    #[clap(value_parser)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
    room_id: OwnedRoomId,
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
async fn login(cli: Cli) -> Result<Client> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
    // Note that when encryption is enabled, you should use a persistent store to be
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
    // able to restore the session with a working encryption setup.
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
    // See the `persist_session` example.
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
    let mut builder = Client::builder().homeserver_url(cli.homeserver);
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
    if let Some(proxy) = cli.proxy {
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
        builder = builder.proxy(proxy);
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
    let client = builder.build().await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
    client
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
        .matrix_auth()
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
        .login_username(&cli.user_name, &cli.password)
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
        .initial_device_display_name("rust-sdk")
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
        .await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
    Ok(client)
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
#[tokio::main]
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
async fn main() -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
    tracing_subscriber::fmt::init();
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
7ff8adafe9e4atagen2026-10-22 12:30 UTC62
    let cli = Cli::parse();
7ff8adafe9e4atagen2026-10-22 12:30 UTC63
    let room_id = cli.room_id.clone();
7ff8adafe9e4atagen2026-10-22 12:30 UTC64
    let client = login(cli).await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC65
7ff8adafe9e4atagen2026-10-22 12:30 UTC66
    let sync_settings = SyncSettings::default();
7ff8adafe9e4atagen2026-10-22 12:30 UTC67
7ff8adafe9e4atagen2026-10-22 12:30 UTC68
    // Wait for the first sync response
7ff8adafe9e4atagen2026-10-22 12:30 UTC69
    println!("Wait for the first sync");
7ff8adafe9e4atagen2026-10-22 12:30 UTC70
7ff8adafe9e4atagen2026-10-22 12:30 UTC71
    client.sync_once(sync_settings.clone()).await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC72
7ff8adafe9e4atagen2026-10-22 12:30 UTC73
    // Get the timeline stream and listen to it.
7ff8adafe9e4atagen2026-10-22 12:30 UTC74
    let room = client.get_room(&room_id).unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC75
    let timeline = room.timeline().await.unwrap();
7ff8adafe9e4atagen2026-10-22 12:30 UTC76
    let (timeline_items, mut timeline_stream) = timeline.subscribe().await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC77
7ff8adafe9e4atagen2026-10-22 12:30 UTC78
    println!("Initial timeline items: {timeline_items:#?}");
7ff8adafe9e4atagen2026-10-22 12:30 UTC79
    tokio::spawn(async move {
7ff8adafe9e4atagen2026-10-22 12:30 UTC80
        while let Some(diffs) = timeline_stream.next().await {
7ff8adafe9e4atagen2026-10-22 12:30 UTC81
            println!("Received timeline diffs: {diffs:#?}");
7ff8adafe9e4atagen2026-10-22 12:30 UTC82
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC83
    });
7ff8adafe9e4atagen2026-10-22 12:30 UTC84
7ff8adafe9e4atagen2026-10-22 12:30 UTC85
    // Sync forever
7ff8adafe9e4atagen2026-10-22 12:30 UTC86
    client.sync(sync_settings).await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC87
7ff8adafe9e4atagen2026-10-22 12:30 UTC88
    Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC89
}