+++ date = "2022-12-10" tags = ["matrix","rust"] title = "matrixのclientを作ってみた" slug = "matrix-client" +++ [matrix-rust-sdk](https://docs.rs/matrix-sdk/latest/matrix_sdk/index.html) どんな感じで書けばいいのかexampleを載せておきます。そのままでは動きませんが。 ```rust:src/client.rs #[allow(unused_mut)] let mut client_builder = Client::builder().homeserver_url(homeserver_url); #[cfg(feature = "sled")] { let home = dirs::home_dir().expect("no home directory found").join("sdk"); client_builder = client_builder.sled_store(home, None)?; } #[cfg(feature = "indexeddb")] { client_builder = client_builder.indexeddb_store("sdk", None).await?; } let client = client_builder.build().await?; // login client .login_username(username, password) .initial_device_display_name("sdk") .send() .await?; // sync client.sync_once(SyncSettings::default()).await.unwrap().next_batch; let sync_token = client.sync_once(SyncSettings::default()).await.unwrap().next_batch; let settings = SyncSettings::default().token(sync_token); client.sync(settings).await?; client.sync(SyncSettings::default()).await?; ``` ```rust:src/post.rs let alias = "#example:matrix.org"; let id = "!example:matrix.org"; let message = "test"; // room_id let room_id = <&RoomId>::try_from(id).unwrap(); // room_alias let room_alias = <&RoomAliasId>::try_from(alias).unwrap(); let room = client.resolve_room_alias(&room_alias).await?; let room_id = room.room_id; if let Some(room) = client.get_joined_room(&room_id) { // text client.join_room_by_id(&room_id).await?; let content = RoomMessageEventContent::text_plain(&message); room.send(content, None).await?; // html let o = "test"; let content = RoomMessageEventContent::text_html(&message, &o); room.send(content, None).await?; } ``` ```rust:src/timeline.rs async fn timeline(event: OriginalSyncRoomMessageEvent, room: Room) { let Room::Joined(room) = room else { return }; let room_id = room.room_id(); let u = event.sender; let body = event.content.body(); println!("{} {} {}", room_id, u, body); } client.add_event_handler(timeline); ``` ```rust:src/bot.rs async fn bot(event: OriginalSyncRoomMessageEvent, room: Room) { let Room::Joined(room) = room else { return }; let MessageType::Text(text_content) = event.content.msgtype else { return }; if text_content.body.contains("!party") { let content = RoomMessageEventContent::text_plain("test"); room.send(content, None).await.unwrap(); } } client.add_event_handler(bot); ```