1
0
hugo/content/blog/2022-12-10-matrix.md

92 lines
2.6 KiB
Markdown
Raw Permalink Normal View History

2024-04-23 13:21:26 +00:00
+++
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 = "<code>test</code>";
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);
```